2013-08-07 12 views
5

Ich arbeite an einem Projekt, in dem ich ein generisches JOptionPane programmatisch schließen möchte (indem ich nicht auf irgendwelche Knöpfe physikalisch klicke). Wenn ein Timer abläuft, möchte ich alle möglichen JOptionPane schließen, die möglicherweise geöffnet sind und den Benutzer zurück zum Anmeldebildschirm meines Programms kicken. Ich kann den Benutzer gut zurückwerfen, aber das JOptionPane bleibt, es sei denn, ich klicke physisch auf einen Knopf darauf.Ein JOtionPane programmatisch schließen

Ich habe auf vielen Seiten mit so viel Glück geschaut. Ein doClick() -Methodenaufruf auf dem "Red X" des JOptionPane scheint nicht möglich zu sein und JOoptionpane.getRootFrame() zu verwenden. Dispose() funktioniert nicht.

+0

Ist das, was du bist Auf der Suche nach? http://stackoverflow.com/questions/7787499/how-can-i-dismiss-one-joptionpane-upon-ergengence-of-another-joptionpane-in-the-g – GGrec

+0

typisch (wenn auch nicht unbedingt), ist eine Optionspane in einem modalen JDialog angezeigt, so dass höchstens ein optionPane geöffnet ist. – kleopatra

+0

@GGrec - Diese Antwort ist auf der richtigen Spur, aber ich finde Schleifen durch die Fenster, wie kleopatra vorgeschlagen, um in meinem Fall viel besser zu arbeiten. Vielen Dank! – Codester89

Antwort

14

Rein technisch können Sie eine Schleife durch alle Fenster der Anwendung, Kontrolle ist sie vom Typ JDialog sind und ein Kind vom Typ JOptionPane hat, und den Dialog entsorgen, wenn so:

Action showOptionPane = new AbstractAction("show me pane!") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     createCloseTimer(3).start(); 
     JOptionPane.showMessageDialog((Component) e.getSource(), "nothing to do!"); 
    } 

    private Timer createCloseTimer(int seconds) { 
     ActionListener close = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Window[] windows = Window.getWindows(); 
       for (Window window : windows) { 
        if (window instanceof JDialog) { 
         JDialog dialog = (JDialog) window; 
         if (dialog.getContentPane().getComponentCount() == 1 
          && dialog.getContentPane().getComponent(0) instanceof JOptionPane){ 
          dialog.dispose(); 
         } 
        } 
       } 

      } 

     }; 
     Timer t = new Timer(seconds * 1000, close); 
     t.setRepeats(false); 
     return t; 
    } 
}; 
+0

Sehr interessanter Weg, um das Ziel zu erreichen :-) Sieht vielversprechender aus als meine eigene Herangehensweise :-) –

+0

Deine war auch richtig (wurde abgelenkt, bevor ich die Möglichkeit hatte, aufzufrischen :-) In allen realen Kontexten würde ich _some_ halten erwarten Track welcher Timer gehört zu welcher OptionPane – kleopatra

+0

Ich passte meinen Ansatz mit Ihrem, dann habe ich festgestellt, dass ich vergessen habe, den Timer irgendwo herunter zu schalten :(und außerdem in diesem vorgestellten Ansatz, gibt es keine Notwendigkeit, ein Ding zu einem anderen zu konvertieren, und alles funktioniert entsprechend :-) –

Verwandte Themen