在java / swing中关闭窗口时采取的正确动作是什么? [英] What is the right action to take upon closing windows in java/swing?

查看:310
本文介绍了在java / swing中关闭窗口时采取的正确动作是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚在我的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在关闭时做什么所有顶级窗口关闭时退出的程序?

解决方案

您可以使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆