在java / swing中关闭窗口时采取的正确动作是什么? [英] What is the right action to take upon closing windows in java/swing?
问题描述
public static void main(String [] args){
final JDialog dialog = CustomUIPanel.createDialog(null,
CustomUIPanel.selectFile());
dialog.addWindowListener(new WindowAdapter(){
@Override public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
如果 CustomUIPanel.main()
是程序的入口点,但它让我想知道什么:如果另一个类叫 CustomUIPanel.main()
进行测试怎么办?那么我对 System.exit(0)
的调用是不正确的。
有没有办法告诉Swing事件如果没有顶级窗口,调度线程会自动退出?
如果没有,如果目标是为了,JDialog / JFrame在关闭时做什么所有顶级窗口关闭时退出的程序?
您可以使用 setDefaultCloseOperation()
方法 JDialog
,指定 DISPOSE_ON_CLOSE
:
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
另请参见 12.8节目退出。
附录: camickr的帮助答案,当窗口关闭或按下关闭按钮时,此示例退出。
import java.awt.EventQueue ;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
/ ** @see http://stackoverflow.com/questions/5540354 * /
public class DialogClose extends JDialog {
public DialogClose(){
this.setLayout(new GridLayout(0,1));
this.add(new JLabel(Dialog close test。,JLabel.CENTER));
this.add(new JButton(new AbstractAction(Close){
@Override
public void actionPerformed(ActionEvent e){
DialogClose.this.setVisible (false);
DialogClose.this.dispatchEvent(new WindowEvent(
DialogClose.this,WindowEvent.WINDOW_CLOSING));
}
}));
}
private void display(){
this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public static void main(String [] args){
EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
new DialogClose()。display();
}
});
}
}
I just wrote this test code in my CustomUIPanel class:
public static void main(String[] args) {
final JDialog dialog = CustomUIPanel.createDialog(null,
CustomUIPanel.selectFile());
dialog.addWindowListener(new WindowAdapter() {
@Override public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
It works correctly if CustomUIPanel.main()
is the program's entry point, but it makes me wonder something: what if another class called CustomUIPanel.main()
for testing? Then my call to System.exit(0)
is incorrect.
Is there a way to tell the Swing event dispatch thread to exit automatically if there are no top-level windows?
If not, what's the right thing for a JDialog/JFrame to do upon closing if the goal is for the program to exit when all the top level windows are closed?
You can use the setDefaultCloseOperation()
method of JDialog
, specifying DISPOSE_ON_CLOSE
:
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
See also 12.8 Program Exit.
Addendum: Incorporating @camickr's helpful answer, this example exits when either the window is closed or the close button is pressed.
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
/** @see http://stackoverflow.com/questions/5540354 */
public class DialogClose extends JDialog {
public DialogClose() {
this.setLayout(new GridLayout(0, 1));
this.add(new JLabel("Dialog close test.", JLabel.CENTER));
this.add(new JButton(new AbstractAction("Close") {
@Override
public void actionPerformed(ActionEvent e) {
DialogClose.this.setVisible(false);
DialogClose.this.dispatchEvent(new WindowEvent(
DialogClose.this, WindowEvent.WINDOW_CLOSING));
}
}));
}
private void display() {
this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new DialogClose().display();
}
});
}
}
这篇关于在java / swing中关闭窗口时采取的正确动作是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!