我在我的CustomUIPanel类中写了这个测试代码:
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在关闭时执行什么?
解决方法
您可以使用jdialog的
setDefaultCloseOperation()方法,指定disPOSE_ON_CLOSE:
setDefaultCloSEOperation(jdialog.disPOSE_ON_CLOSE);
参见12.8 Program Exit.
附录:结合@ 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 https://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();
}
});
}
}