La differenza che vedo è (in esecuzione su JDK 1.7):Perché gli ascoltatori di finestre/componenti sono richiamati in modo diverso quando setVisible (false) e dispose() sono chiamati?
setVisible(false)
, invocacomponentHidden
ma nonwindowClosed
(stati l'API solo sudispose()
quindi è OK anche se mi irrita)
ma
dispose()
, invocawindowClosed
ma noncomponentHidden
breve esempio l'esecuzione di codice (MCVE):
public class JDialogTest extends JDialog {
private static final long serialVersionUID = 1L;
public JDialogTest(JFrame owner){
super(owner,ModalityType.APPLICATION_MODAL);
init();
}
private void init() {
this.getContentPane().setLayout(new GridLayout(1,2));
JButton btnVisible = new JButton("Set visible false");
btnVisible.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JDialogTest.this.setVisible(false);
}
});
JButton btnDispose = new JButton("Dispose");
btnDispose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JDialogTest.this.dispose();
}
});
this.getContentPane().add(btnVisible);
this.getContentPane().add(btnDispose);
this.pack();
}
public static void main(String[] args) {
//A fake frame to test JDialog
JFrame fakeFrame = new JFrame("Fake Frame");
fakeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fakeFrame.getContentPane().setLayout(new BorderLayout());
JButton btnOpen = new JButton("Open Dialog");
fakeFrame.getContentPane().add(btnOpen,BorderLayout.CENTER);
fakeFrame.pack();
fakeFrame.setLocationRelativeTo(null);
//Generate the test dialog
final JDialogTest dialog = new JDialogTest(fakeFrame);
dialog.addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
System.out.println("Component Shown");
}
@Override
public void componentHidden(ComponentEvent e) {
System.out.println("Component Hidden");
}
});
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
System.out.println("Window open");
}
@Override
public void windowClosed(WindowEvent e) {
System.out.println("Window closed");
}
});
dialog.setLocationRelativeTo(null);
btnOpen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.setVisible(true);
}
});
fakeFrame.setVisible(true);
}
}
NOTA: L'esempio dispone di un JDialog
, ma vedo stesso comportamento in JFrame
, per testare semplice collegare il ascoltatori allo fakeFrame
e aggiungi pulsanti simili. (evitato in MVCE di mantenerlo M inimo)).
ho considerato questo post:
JDialog setVisible(false) vs dispose()
- Nel risposte sembra che sia dovrebbe essere alcuna differenza, utilizzare
dispose()
...
documentazione API:
Window.setVisible(boolean b) , Window.dispose(), ComponentListener.componentHidden(ComponentEvent e), WindowListener.windowClosed(WindowEvent e)
Perché mi interessa: Naturalmente per curiosità, ma anche perché io uso i tasti per chiudere la finestra (invocando dispose()
) e l'interfaccia può essere chiuso dalla finestra vicino icona in alto/a destra e alt + F4 (invocando setVisible(false)
!?). Quindi nessuno dei suddetti ascoltatori può essere usato. Solo lo HierarchyListener
li catturerà entrambi e questo sembra contro-intuitivo.
MODIFICA: La domanda è intesa come "perché è così"? Qual è lo scopo?". Mi aspettavo dispose()
per invocare sia! Non riesco a trovare alcun indizio nella documentazione delle API per il motivo per cui non.
@mKorbel, modifica i tag poiché vedo lo stesso comportamento in JFrame. Ho visto lì dove alcuni commenti cancellati quando sono tornato da pranzo, qualcosa di interessante? –
Perché sono metodi diversi e questo è ciò che il codice sorgente mostra. Cosa ti aspettavi? Che tipo di risposta stai cercando? – user1803551
Ho aggiornato il post per riflettere ciò che mi aspettavo e quale risposta stavo saltando per ottenere. –