我正在开发一个具有多个Swing GUI的应用程序。主GUI有一个按钮,一旦按下,就会调用另一个GUI。问题是,一旦按下该按钮并且出现新的GUI,两个窗口都会挂起。
我一直在调查SwingUtilities.invokeLater
但是我不能用它来创建第一个GUI,因为我传递了一个对象的引用,我不希望它是'final'的编译器要求。
使用以下命令创建第一个GUI:
MainUI gui = new MainUI(player);
gui.setVisible(true);
第二个创建于:
private void challengeBtnActionPerformed(java.awt.event.ActionEvent evt) {
if (board.isVisible()) {
board.dispose();
resetComponents();
} else {
MainUI gui = new MainUI(player);
gui.setVisible(true);
}
}
请帮帮我吗?
答案 0 :(得分:6)
再一次:您不应该与除EDT之外的任何线程的Swing组件进行交互。
您应该通过以下方式调用MainUI
:
public class MainUI extends javax.swing.JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainUI().setVisible(true);
}
});
}
}
您可以重新设计自己的应用,以便以这种方式调用MainUI
。
更新:
以下代码应该有效。
public class MainUI extends javax.swing.JFrame {
public static void main(String[] args) {
final Player player = new Player();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainUI(player).setVisible(true);
}
});
player.changeState(); // You can do this
// player = new Player(); // You can't do that
}
}