2013-08-07 13 views
5

Pracuję nad projektem, w którym chciałbym programowo zamknąć ogólny program JOptionPane (przez fizyczne kliknięcie dowolnego przycisku). Kiedy upłynie czas, chciałbym zamknąć wszelkie możliwe JOptionPane, które mogą być otwarte i kopnąć użytkownika z powrotem do ekranu logowania mojego programu. Mogę skopać użytkownika z powrotem, ale JOptionPane pozostaje, chyba że fizycznie kliknę przycisk na nim.Zamykanie programu JOptionPane Programowo

Zajrzałem na wiele stron bez takiego szczęścia. Wywołanie metody doClick() w "Red X" JOptionPane nie wydaje się możliwe, a użycie JOptionpane.getRootFrame(). Dispose() nie działa.

+0

Czy to, co masz szukasz? http://stackoverflow.com/questions/7787499/how-can-i-dismiss-one-joptionpane-up-ence-of-another-joptionpane-in-the-g – GGrec

+0

zwykle (choć niekoniecznie), jest opcjonalna pokazany w modalnym JDialog, więc istnieje co najwyżej jedna opcja otwarta. – kleopatra

+0

@GGrec - Ta odpowiedź jest na dobrej drodze, ale znajduję pętle w oknach, jak sugerował Kleopatra, aby w moim przypadku działała znacznie lepiej. Dzięki! – Codester89

Odpowiedz

14

Technicznie można pętli wszystkich okien aplikacji, check oni są typu JDialog i mieć dziecko typu JOptionPane i usuwać okno jeśli tak, to:

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

Bardzo interesujący sposób na osiągnięcie celu :-) Wygląda bardziej obiecująco niż moje własne podejście :-) –

+0

twoje też było poprawne (zostało rozproszone, zanim miałem możliwość nagłośnienia :-) We wszystkich rzeczywistych kontekstach spodziewałem się ślad, który zegar należy do której opcjiPolka – kleopatra

+0

Dopasowałem moje podejście do ciebie, potem stwierdziłem, że zapomniałem zamknąć timera w dowolnym miejscu :(a ponadto w tym przedstawionym podejściu, nie ma potrzeby konwersji jednej rzeczy na drugą, i wszystko działa zgodnie z :-) –