一些相关问题:
我想从第一个开启第二个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);
声明除外)
谢谢!
答案 0 :(得分:1)
与Java程序的main方法不同,所有Swing侦听器都在事件派发线程中执行。因此,当单击第一帧上的按钮时,您已经在EDT中,并且无需使用EventQueue.invokeLater()
打开第二帧。
如果您不打算使用它,第二个JFrame中的主要方法确实没用。只需创建第二帧的实例,并使其可见:
SecondFrame frame = new SecondFrame();
frame.setVisible(true);