2011-08-06 13 views
12

Chcę dodać przycisk (JButton) na dole JDialog, który powinien zamknąć JDialog po naciśnięciu. Problem polega na tym, że nie wiem, co napisać w ActionListener tego przycisku. Nie chcę, aby przycisk opuścił program, wystarczy zamknąć okno dialogowe.Przycisk do zamknięcia JDialog

JDialog jest tworzony przez bezpośrednie wywołanie jednego z konstruktorów JDialog, a nie przez wywołanie jednej z metod z JOptionPane.

Byłem bardzo zaskoczony, że nie mogłem znaleźć odpowiedzi na to za pomocą Google. Spodziewałem się, że problem, który jest tak często kwestionowany, będzie szeroko omawiany na wielu stronach programowania. Całkiem dziwne, że tak nie jest.

+0

Cóż, nigdy wcześniej nie korzystałem z JDialog. I spojrzałem na to javadoc kilkadziesiąt razy (potrzebowałem zobaczyć, jakie metody zawiera). Ale nie widziałem nic na temat zamykania go. – SoboLAN

+1

@SoboLAN dwie metody: 'dispose()' & 'setVisible (false)' –

Odpowiedz

27
import java.awt.event.*; 
import javax.swing.*; 

public class YourDialog extends JDialog implements ActionListener { 

    JButton button; 

    public YourDialog() { 
    button = new JButton("Close"); 
    button.addActionListener(this); 
    add(button); 
    pack(); 
    setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
     dispose(); 
    } 
} 
  • blisko tylko dialolg pomocą dispose() metody ramki nadrzędnej nie zamkniętym. powód, dla którego JVM nie została zakończona.

+0

Myślę, że dispose() jest najlepszym sposobem to zrobić. Dziękuję, mam teraz wszystko, czego potrzebuję. – SoboLAN

5

W metodzie actionPerformed() z ActionListener będziesz chciał coś takiego:

dialog.setVisible(false); 

Jeśli chcesz pozbyć się okna stałe (uwolnić go z pamięci) to byś również wezwanie:

dialog.dispose(); 

... gdzie dialog jest nazwą twojego okna dialogowego. Jeśli dialog jest zmienną lokalną, musisz ją wykonać, aby uzyskać do niej dostęp w ten sposób.

Jeśli dodajesz przycisk jako część podklasy JDialog (czyli jeśli masz class MyDialog extends JDialog i dodajesz słuchacza działania w MyDialog) będziemy chcieli:

MyDialog.this.setVisible(false); 
+0

Zrobiłem to, gdy utworzyłem JDialog: dialog.SetDefaultCloseOperation (JDialog.DISPOSE_ON_CLOSE) ;. W ActionListener nazwałem te 2 metody: dialog.setVisible (false); dialog.dispatchEvent (nowy WindowEvent (okno dialogowe, WindowEvent.WINDOW_CLOSING); JDialog rzeczywiście zamyka się, ale sposób, w jaki to zrobiłem jest poprawny? Dziękuję za twoją (zaskakująco szybką) odpowiedź, btw. – SoboLAN

+0

@SoboLAN Bez obaw - tak, to jest właściwe podejście: – berry120

+0

@ berry120 - Z pewnością JDialog, jego układ i komponenty będą nadal istniały w pamięci przy użyciu tej metody? Wyobrażam sobie, że możesz zrobić sobie poważny bałagan robiąc to regularnie –

6

Ty może mieć ActionListener wysyłkę WindowEvent.WINDOW_CLOSING, jak pokazano here.

+2

+1, wywołując zdarzenie do okna wszystkie przechowuje dowolny kod WindowListener do wykonania. Za to, co warto, możesz również sprawdzić klasę "ExitAction" w [Zamykanie aplikacji] (http://tips4java.wordpress.com/2009/05/01/closing-an-application/). Akcja jest trochę bardziej ogólna, ponieważ może być używana z dowolną ramką lub dialogiem. – camickr

+0

@camickr: 'ExitAction' wygląda jak dobry sposób na zapewnienie, że wszystkie wyjścia przechodzą przez' WindowListener'. – trashgod

Powiązane problemy