java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > AWT, Swing, JavaFX & SWT

AWT, Swing, JavaFX & SWT Themen zur Programmierung von Benutzer-Oberflächen (GUI, Applet) sowie zur Grafikprogrammierung (2D / 3D)

Thema geschlossen    
Themen-Optionen Thema durchsuchen Ansicht
Alt 01.04.2008, 16:14   #1 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 02.01.2004
Fachbeiträge: 1.566
Abgegebene Danke: 4
Erhielt 23 Danke für 23 Beiträge
Standard Minimieren und Maximieren eines JFrames verhindern

Hallo,

ich habe einen Dialog, der eigentlich modal sein soll, es aufgrund von GUI-Leitlinien aber nicht sein kann (der Dialog braucht eine Popup-Animation, welche bei setModal(true) nicht zu sehen wäre, weil setVisible() den Thread blockiert). Also bin ich gerade dabei, modales Verhalten zu imitieren. Das Abfangen von InputEvents ist dank GlassPane kein Problem, das Verhindern des Fensterschließens ebenfalls nicht.

Aber man kann das Elternfenster immer noch minimieren und maximieren, was ebenfalls nicht sein soll ... Wie kann ich das verhindern? Umbauen auf Window scheidet aus, weil ich keine Macht über das Elternfenster habe. Einen WindowListener, der bei windowIconified() setState(Frame.NORMAL) aufruft, habe ich ausprobiert, sieht aber s*****e aus.

Am liebsten wäre es mir, man könnte das Verhalten einfach deaktivieren - aber wie?

mpG
Tobias
__________________
Freies Mitglied der Volksfront von Judäa
Tobias ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.04.2008, 16:21   #2 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von thE_29
 
Registriert seit: 11.05.2004
Fachbeiträge: 6.733
Blog-Einträge: 3
Abgegebene Danke: 4
Erhielt 51 Danke für 40 Beiträge
Ich würde bei der Animation weitermachen!

Kann man den das modale verhalten nach setvisible true ändern? Falls ja, lass ihn zuerst nicht modal mach deine Animation und dann setz den auf modal!

Desweiteren verstehe ich nicht warum eine Animation blockiert wird? Oder wie machst/startest du die Animation?
__________________
Wir machen Fehler aus Versehen, die anderen aus Dummheit. (Gabriel Laub)
Pur Java Registry Reader - http://sourceforge.net/projects/java-registry/
thE_29 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.04.2008, 16:25   #3 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 04.08.2004
Fachbeiträge: 111
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Sollte man das nicht mit setResizable(false) verhindern können?

Evtl. hab ich dich aber auch falsch verstanden.
__________________
--- It is only in our decisions that we are important. Jean-Paul Sartre ---
Noar ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.04.2008, 19:47   #4 (permalink)
Stammbenutzer
Megabyte
Themenstarter
 
Registriert seit: 02.01.2004
Fachbeiträge: 1.566
Abgegebene Danke: 4
Erhielt 23 Danke für 23 Beiträge
ARGH! Manchmal sieht man echt den Wald vor lauter Bäumen nicht! Dialog hat eine Methode setModal() mit der sich alles wunderbar machen lassen sollte ...

Danke, thE_29!

mpG
Tobias

P.S.: @Noar: setResizable() verhindert das Maximieren, aber nicht das Minimieren.
P.P.S.: Funktioniert leider nicht wie gewünscht. Zwar liefert isModal() true zurück, doch das Parentfenster läßt sich weiterhin schließen und nimmt auch Eingabeevents an ... Ich geh da mal mit nem Debugger dran.
__________________
Freies Mitglied der Volksfront von Judäa
Tobias ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.04.2008, 20:25   #5 (permalink)
Stammbenutzer
Megabyte
Themenstarter
 
Registriert seit: 02.01.2004
Fachbeiträge: 1.566
Abgegebene Danke: 4
Erhielt 23 Danke für 23 Beiträge
Ok, setModal funktioniert prima vor dem setVisible, aber leider nicht mehr danach. Muß ich also den ursprünglichen Ansatz weiterverfolgen ...

Zur Animation: Der Dialog ist dazu gedacht auf Touchscreens Eingabehilfen für Formulare anzubieten. Damit man nicht die Orientierung verliert, poppt der Dialog immer von da auf, wo man auf das Formular "geklickt" (mit dem Finger draufgepatscht) hat.

Diese Animation ist mit Hife des TimingFrameworks (https://timingframework.dev.java.net/) in der setVisible() des Dialogs realisiert. Damit man was sieht muß aber die Animation NACH super.setVisible() ausgeführt werden, was aber nicht passiert, da super.setVisible() den Thread blockiert. Wenn ich die Animation um ein paar Konsolenausgaben bereicher, sehe ich diese deshalb immer erst nach dem Schließen des Dialogs. Deshalb kommt ein modaler Dialog nicht in Frage.

mpG
Tobias
__________________
Freies Mitglied der Volksfront von Judäa
Tobias ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.04.2008, 22:33   #6 (permalink)
Premium-Benutzer
 
Registriert seit: 23.02.2004
Fachbeiträge: 4.725
Abgegebene Danke: 0
Erhielt 91 Danke für 78 Beiträge
Ähm... aber du weißt dass es sowas wie "Threads" gibt? (Ich gehe davon aus dass du das weißt )

Soll heißen: Du kannst die Animation natürlich nicht direkt in die setVisible-Methode packen. Aber du kannst an der Stelle einen Thread starten, der den Dialog animiert.

Edit: Oder blockieren modale Dialoge alle Threads? Kann ich mir eigentlich nicht vorstellen, mom
__________________
Sorry I don't know what you just said because I was thinking about Batman.
Illuvatar ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.04.2008, 22:54   #7 (permalink)
Stammbenutzer
Megabyte
Themenstarter
 
Registriert seit: 02.01.2004
Fachbeiträge: 1.566
Abgegebene Danke: 4
Erhielt 23 Danke für 23 Beiträge
Ja, das es Threads gibt, weiß ich. Die Animation wird in der setVisible ja auch nur angestoßen. Das TimingFramework ist intern eine Listener-Architektur auf Basis des javax.swing.Timers, wenn ich das richtig verstanden habe. Eigentlich sollte das doch im AWT Dispatch Thread weiterlaufen können, denn ein modaler Dialog sollte lediglich InputEvents auf das Elternfenster abblocken. Aber nach super.setVisible(true) passiert bei modalen Dialogen gar nichts mehr, bis der Dialog geschlossen ist. Da dürfte es dann auch schwierig werden nachträglich noch einen zweiten Thread mit der Animation anzustoßen (Zumal der dann ja auch mit dem AWT Dispatch Thread synchronisiert weden müßte).

Ich habe jetzt eine Ausweichstrategie geplant, die mir zwar nicht so gut gefällt, aber im Prototyp funktioniert: Ich animiere nicht den modalen Dialog selbst, sondern ein undekoriertes JWindow und setze den eigentlichen (jetzt modalen) Dialog nach Beendigung der Animation auf sichtbar und verstecke das "Platzhalterfenster" wieder.

mpG
Tobias
__________________
Freies Mitglied der Volksfront von Judäa
Tobias ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.04.2008, 23:09   #8 (permalink)
Premium-Benutzer
 
Registriert seit: 23.02.2004
Fachbeiträge: 4.725
Abgegebene Danke: 0
Erhielt 91 Danke für 78 Beiträge
Hm gut ich kenn das TimingFramework nicht.
Ich hab jetzt grad so schön ein Testbeispiel zusammengebastelt, das poste ich jetzt trotzdem mal noch

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ModalTest extends JFrame
{
  public ModalTest(String title)
  {
    super(title);
    setDefaultCloseOperation (EXIT_ON_CLOSE);
    setSize(800, 600);
    setLocationRelativeTo(null);
    addMouseListener (new DialogCaller());
    setResizable(false);
    setVisible(true);
  }
  
  @Override
  public void paint (Graphics g)
  {
    super.paint(g);
    g.drawString("Click or die!", 100, 100);
  }

  public static void main(String[] args) {
    new ModalTest("ModalTest");
  }
}
class DialogCaller extends MouseAdapter
{
   @Override
   public void mouseClicked (MouseEvent evt)
   {
     JDialog popup = createDialog ((Component)evt.getSource());
     
     Dimension startSize = new Dimension (150, 50); // frames cannot be 0/0, that would thus look bad
     Point startPoint = new Point (evt.getPoint());
     SwingUtilities.convertPointToScreen (startPoint, (Component)evt.getSource());
     startPoint.translate (-startSize.width / 2, -startSize.height / 2); // center it
     DialogAnimator da = new DialogAnimator (popup, startPoint, popup.getLocation(),
                         startSize, popup.getSize(), 1500L);
                         
     da.start();
     popup.setVisible(true);
   }
   
   private static JDialog createDialog(Component parentComponent)
   {
     JOptionPane jop = new JOptionPane("That's just a simple test message, dude! No worryin'!",
                                       JOptionPane.ERROR_MESSAGE, JOptionPane.DEFAULT_OPTION);
     return jop.createDialog(parentComponent, "Test");
   }
}
class DialogAnimator implements Runnable
{
   private JDialog dialog;
   private Point startPoint, endPoint;
   private Dimension startSize, endSize;
   private long time, startTime;
   private boolean started;
   
   public DialogAnimator (JDialog dialog, Point startPoint, Point endPoint,
                          Dimension startSize, Dimension endSize, long time)
   {
      this.dialog = dialog;
      this.startPoint = startPoint;
      this.endPoint = endPoint;
      this.startSize = startSize;
      this.endSize = endSize;
      this.time = time;
      started = false;
   }
   
   public synchronized void start()
   {
      if (started)
         throw new IllegalStateException ("Animation has already started");
      startTime = System.currentTimeMillis();
      started = true;
      new Thread(this).start();
   }
   
   @Override
   public void run()
   {
      for (long timePassed = 0; timePassed < time; timePassed = System.currentTimeMillis() - startTime){
         double perc = 1.0 * timePassed / time;
         Point currentPoint = lerpPoint (startPoint, endPoint, perc);
         Dimension currentSize = lerpSize (startSize, endSize, perc);
         dialog.setLocation (currentPoint);
         dialog.setSize (currentSize);
      }
      dialog.setLocation (endPoint);
      dialog.setSize (endSize);
   }
   
   private static Point lerpPoint (Point p1, Point p2, double perc)
   {
     Point ret = new Point();
     ret.x = p1.x + (int) Math.round (perc * (p2.x - p1.x));
     ret.y = p1.y + (int) Math.round (perc * (p2.y - p1.y));
     return ret;
   }

   private static Dimension lerpSize (Dimension d1, Dimension d2, double perc)
   {
     Dimension ret = new Dimension();
     ret.width = d1.width + (int) Math.round (perc * (d2.width - d1.width));
     ret.height = d1.height + (int) Math.round (perc * (d2.height - d1.height));
     return ret;
   }
}
__________________
Sorry I don't know what you just said because I was thinking about Batman.
Illuvatar ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 02.04.2008, 07:58   #9 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von thE_29
 
Registriert seit: 11.05.2004
Fachbeiträge: 6.733
Blog-Einträge: 3
Abgegebene Danke: 4
Erhielt 51 Danke für 40 Beiträge
Wie wärs mit dem Aufruf von der Animation in
Code:
SwingUtitlies.invokeLater(new Runnable(){public void run()
{
//aufruf hier
}
});
setVisible(true);
__________________
Wir machen Fehler aus Versehen, die anderen aus Dummheit. (Gabriel Laub)
Pur Java Registry Reader - http://sourceforge.net/projects/java-registry/
thE_29 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 02.04.2008, 10:37   #10 (permalink)
Stammbenutzer
Megabyte
Themenstarter
 
Registriert seit: 02.01.2004
Fachbeiträge: 1.566
Abgegebene Danke: 4
Erhielt 23 Danke für 23 Beiträge
Danke für eure zahlreichen Hilfestellungen. Besonderen Dank an Illuvatar für das Beispiel.

Da ich leider mehrere Tage hinterm Zeitplan hänge und im Prototyp eine funktionierende Lösung vorhanden ist, werde ich die jetzt auch so übernehmen - selbst wenn sie nicht gerade das Gelbe vom Ei ist .

mpG
Tobias
__________________
Freies Mitglied der Volksfront von Judäa
Tobias ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Eclipse - Views minimieren/maximieren reibi IDEs und Tools 3 29.09.2008 10:05
Was passiert beim Minimieren eines JFrames? ich² AWT, Swing, JavaFX & SWT 0 20.05.2008 15:50
Einzelne Fenster in Webseite maximieren/minimieren? digitaloverdose Für Verirrte - Fragen zu JavaScript 7 25.01.2007 08:28
Minimieren- und Maximieren-Button eines JFrame entfernen? Novanic AWT, Swing, JavaFX & SWT 11 24.07.2006 16:38
Verschieben eines JFrames verhindern Novanic AWT, Swing, JavaFX & SWT 1 07.04.2006 01:25


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de