打开另一个JFrame实例(来自JFrame):使用EventQueue.invokeLater? (事件发送线程)

时间:2014-01-26 15:41:40

标签: java jframe event-dispatch-thread

一些相关问题:

我想从第一个开启第二个JFrame窗口。第一个有一个main()方法,而按钮点击处理程序将打开第二个JFrame。 (小心拼写错误,我把它浓缩了)。

创建第二个JFrame的好习惯是什么? (我认为它必须是一个JFrame。)我希望能够关闭第一个JFrame并使第二个JFrame保持运行,因为它们在第一个用一些数据实例化第二个之后不会相互通信。

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                MyMainClass window = new MyMainClass();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
public MyMainClass() {
    initialize();
}
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 697, 416);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //...       
    JButton btnNewButton = new JButton("Open Second Window");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

        // Would this be the correct thing to do?
        // If this first window is closed, would it
        // close the second one as well? (not what I want)

        new SecondFrame();

        }
    });
    //...       
}

public class SecondFrame extends JFrame {
    private JPanel contentPane;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    SecondFrame frame = new SecondFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public SecondFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
    }

}

我不明白为什么说使用事件派发线程很重要。

我猜测SecondFrame的main()函数中的代码不会被调用,所以相反,它的内容应该移动到按钮的事件处理程序,替换语句new SecondFrame();?或者我可以按原样保留按钮的单击处理程序,并完全删除SecondFrame的main()方法? (setVisible(true);声明除外)

谢谢!

1 个答案:

答案 0 :(得分:1)

与Java程序的main方法不同,所有Swing侦听器都在事件派发线程中执行。因此,当单击第一帧上的按钮时,您已经在EDT中,并且无需使用EventQueue.invokeLater()打开第二帧。

如果您不打算使用它,第二个JFrame中的主要方法确实没用。只需创建第二帧的实例,并使其可见:

SecondFrame frame = new SecondFrame();
frame.setVisible(true);