2013-04-29 6 views
5

Ich sehe den folgenden Code in einem Java/Swing-GUI-Projekt:Wie funktioniert dieser Swing-Code?

MyDialog dlg = new MyDialog(parent, isFizz); 
MyDialogResults results = dlg.getResults(); 

eventBus.fireEvent(new MyDialogEvent(results)); 

In dem obigen Code, MyDialog extends JDialog. Es wird also eindeutig ein untergeordneter Dialog erstellt (und dem Endbenutzer irgendwie angezeigt), und wenn der Benutzer das Dialogfeld beendet (indem er auf OK oder eine andere Schaltfläche klickt), wird eine Bean results verwendet, um ein neues Ereignis für das Ereignis auszulösen Bus.

Aber ich bin zu kämpfen mit zwei Dingen:

  1. Wie/wo ist Java gesagt, tatsächlich zu ziehen/den Dialog mit dem Benutzer zeigen ?; und
  2. Wie/wo wird Java gesagt, zu warten, bis der Benutzer den Dialog beendet, bevor das Ereignis auf den Bus ausgelöst wird?

Ist es, dass ein JDialog Kind immer den Dialog zeigen, wenn die JDialog erstellt wird, und nicht aus dem Konstruktor zurück, bis der Dialog verlassen wird? Hier ist die Zusammenfassung der hte MyDialog Konstruktor von oben:

public class MyDialog extends JDialog { 
    private boolean isFizz; 
    private MyDialogResults results; 

    // Getters and setters for all properties... 

    public MyDialog(Frame parent, boolean isFizz) { 
     super(parent, "My Dialog", true); 

     setIsFizz(isFizz); 

     setVisible(true); 
     dispose(); 
    } 
} 

Vielen Dank im Voraus für jede Hilfe/Einblick mit Verständnis, wie der Dialog öffnet, „hängt“ (obwohl ich weiß, es ist nicht wirklich hing/gefroren), wird geschlossen, und feuert dann das Ereignis ab.

Antwort

1

1)

setVisible(true); 

2)

super(parent, "My Dialog", true); 

Lesen Sie die JavaDocs für JDialog für weitere Details.

meisten relevant sind:

+0

Dank @Andrew Thompson (+1) - aber für # 2 bin ich immer noch verwirrt. Nach dem [Konstruktor Javadoc] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JDialog.html#JDialog%28java.awt.Dialog,%20java.lang.String,% 20boolean% 29) Wenn "modal" auf "true only" gesetzt wird, werden Benutzereingaben in andere Fenster der obersten Ebene blockiert, wenn sie angezeigt werden. Aber das ist nicht dasselbe wie das, was ich hier beschreibe. Ich glaube nicht, dass dies verhindern würde, dass die nächste Codezeile ('MyDialogResults results = dlg.getResults();') ausgeführt wird, bis der Konstruktor fertig ist, da dies keine "Benutzereingabe" ist. –

+1

Das "Wahr" im Superaufruf macht den Dialog modal. Das bedeutet, dass der Aufruf von 'setVisible (true)' erst zurückkehrt, wenn der Dialog geschlossen wird. –

+0

* "" blockiert Benutzereingaben in andere Top-Level-Fenster, wenn "* ..und stoppt die nächste Codezeile von der Ausführung (was hinzugefügt werden soll). –

1

Dialog.setVisible() ist die Methode, die den Dialog und blockiert, bis der Dialog zeigt geschlossen ist. Siehe documentation for Dialog. dispose() zerstört dann das Dialogobjekt.

So war Ihre Schätzung teilweise richtig. Der Konstruktor zeigt den Dialog an, blockiert bis zum Schließen und zerstört anschließend den Dialog. Dies ist jedoch eine Funktion von "MyDialog", nicht von JDialog

+0

Der Dialog wird nicht zerstört, bis die dlg-Instanz den Gültigkeitsbereich verlässt. Deshalb können Sie Werte aus dem Dialogfeld abrufen, nachdem der Benutzer die Schaltfläche OK gedrückt hat. Nach der Dialogkonstruktorzeile sollte auch eine Überprüfung auf die Schaltfläche Abbrechen erfolgen. –