我正在开发一个具有多个Swing GUI的应用程序.主GUI有一个按钮,一旦按下,就会调用另一个GUI.问题是,一旦按下该按钮并且出现新的GUI,两个窗口都会挂起.
我一直在研究SwingUtilities.invokeLater但是我不能用它来创建第一个GUI,因为我传递了一个对象的引用,我不希望它像编译器要求那样是"最终的".
创建第一个GUI:
MainUI gui = new MainUI(player);
gui.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
第二个创建时间:
private void challengeBtnActionPerformed(java.awt.event.ActionEvent evt) {
if (board.isVisible()) {
board.dispose();
resetComponents();
} else {
MainUI gui = new MainUI(player);
gui.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
你能帮我吗?
再一次:除了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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
您可以重新设计您的应用程序,以便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
}
}
Run Code Online (Sandbox Code Playgroud)