2016-07-18 19 views
1

Ich versuche einen JDialog zu erstellen, der geöffnet bleibt, bis er geschlossen wird und dem Benutzer nicht erlaubt, ihn zu schließen.JDialog wird nicht angezeigt, bis 'dispose' ausgeführt wurde

import java.awt.Dialog.ModalityType; 

import javax.swing.JDialog; 
import javax.swing.JOptionPane; 
import javax.swing.SwingUtilities; 

public class MessageClass { 

    private JDialog waitDialog; 

    public MessageClass(String string_,String title_) { 

     JOptionPane msg=new JOptionPane(string_, 
      JOptionPane.INFORMATION_MESSAGE, 
      JOptionPane.DEFAULT_OPTION,null,new Object[]{},null); 
     waitDialog=msg.createDialog(title_); 
    } 

    public void openWait() { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       waitMessage(); 
      } 
     }); 
    } 

    private void waitMessage() { 
     waitDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
     waitDialog.setLocationRelativeTo(GUI.getInstance().frame); 
     waitDialog.setModalityType(ModalityType.DOCUMENT_MODAL); 
     waitDialog.pack(); 
     waitDialog.setVisible(true); 
    } 

    public void closeWait() { 
     waitDialog.dispose(); 
    } 

} 

Ich habe 3 Probleme mit dieser Klasse, die ich nicht verstehen kann. Der erste besteht darin, dass der Bereich erst angezeigt wird, wenn der Dispos aufgerufen wurde. Die zweite ist, dass es nicht verfügbar ist, was wahrscheinlich mit dem ersten Problem zusammenhängt (ich habe nicht versucht, dispose zweimal anzurufen). Der dritte ist, dass der Bereich den Text nicht anzeigt, sondern leer ist.

habe ich die Klasse wie folgt auf:

MessageClass msg=new MessageClass("Information text","Title"); 
msg.openWait(); 
// a bunch of code 
msg.closeWait(); 

Kann jemand vor Ort, was ich falsch mache? TIA.

Antwort

0

Wo laufen Sie openWait() und closeWait()? Wenn sie sich auf EventDispatchThread befinden, blockieren Sie diesen Thread, bis die Ausführung von closeWait() abgeschlossen ist, sodass das Dialogfeld keine Möglichkeit zum Zeichnen erhält.

+0

Danke für die Antwort. Als relativer Java-Neuling stehe ich auf wackeligen Beinen, wenn es darum geht, welchen Thread gerade läuft, also bin ich mir nicht wirklich sicher. Ich dachte, 'invokelater' lässt die Dinge als separate Prozesse laufen, wenn sie an der Reihe sind. Mein 'main' verwendet 'invokelater', um meine Haupt-GUI (JFrame) aufzurufen. Das hat einen Menüpunkt, der einen JDialog instanziiert, der selbst einen 'invokelater' ähnlich dieser Klasse ausführt. Dieser JDialog hat ein Code-Segment, das einige Netzwerk-Sachen erledigt, so dass es einige Zeit dauern kann. Es instanziiert diese Klasse, ruft 'openWait()' auf, um den Benutzer wissen zu lassen, was passiert und den Benutzer warten lässt. –

+0

Ich sollte auch hinzufügen, dass diese Klasse auch aktiv bleibt, wenn die Anwendung beendet wird. –