Wie mache ich non-modal dialog, dessen setVisible-Methode blockiert?
In einem Schwung (J)Dialog, setModal legt die Modalität - also ob der dialog sollte-block-Eingang, um andere Fenster oder nicht. Dann, setVisible-Methode docs sagen für modale Dialoge:
Wenn das Dialogfeld nicht angezeigt wird, wird dieser Anruf wird nicht zurückkehren, bis der dialog ausgeblendet wird durch Aufruf der setVisible-Methode(false) oder dispose auf.
Tatsächlich setVisible
hat Rückkehr sofort, wenn der dialog nicht modal ist. Beispiel-code:
JDialog jd = new JDialog();
jd.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
/**
* If set to false, setVisible returns right away.
* If set to true, setVisible blocks until dialog is disposed.
*/
jd.setModal(false);
System.out.println("setting visible");
jd.setVisible(true);
System.out.println("set visible returned");
Möchte ich einen dialog, der nicht block input zu den anderen Fenstern, aber immer noch hat den Anrufer blockieren. Was ist ein guter Weg, dies zu tun, jetzt, dass setVisible
nicht blockiert, wenn der dialog nicht modal ist?
Gibt es einige Gründe warum setVisible
's Verhalten ist abhängig von der Modalität?
- Lesen Sie die obige Zeile in die Google docs: es ist ziemlich deutlich sagt: "Notizen für modale Dialoge."
- Oops, mein schlechtes. - Bearbeitung...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich in der Regel lösen diese nicht durch die Blockierung der Anrufer, aber durch die Verwendung einer callback-irgendeiner Art - eine einfache Schnittstelle, die den dialog aufruft, wenn es fertig ist. Lassen Sie uns sagen, dass Ihr dialog einen "OK" und "Abbrechen" - Schaltfläche und Sie brauchen, um zu unterscheiden, welche ein gedrückt wird. Dann könnte man etwas wie das hier tun:
Dann haben Sie gerade den pass in einer Instanz von DialogCallback an den Konstruktor:
BEARBEITEN
Gut, genau so wie modal Fenster sollen arbeiten, nicht? Ein modales Fenster sollte block den aktuellen workflow, wenn Sie angezeigt werden, und eine nicht-modale/nicht-modale sollte nicht. Siehe z.B. die Wikipedia-Seiten auf modale Fenster oder Dialogfelder.
Setzen Sie einfach
this.setModal(true)
aber nicht legen Sie den übergeordneten dialog auf der Konstruktor:MyDialog dlg = new JDialog();
this.setModal(true);
Beim Aufruf
setVisible(true)
es wird nicht aufhören,Dem direkten Ansatz ist:
Ich habe einen anderen Weg gefunden, dies zu tun. In dem Konstruktor meiner progress-bar, die sich javax.swing.JDialog, fügte ich hinzu:
Ich dann überschrieb die setVisible-Methode Methode:
In der run () können Sie sehen, einen Anruf zu showProgress(). Das ist ganz einfach:
Was hier passiert, ist die setVisible-Methode () - Methode JDialog blockt. Also ich überschrieb es und rief setVisible-Methode() des JDialog, in einem thread. Wodurch es nicht zu blockieren.
setVisible()
von anderen als dem event-dispatch-thread ist nicht sicher.