2012-01-17 57 views
2

我正在开发一个具有多个Swing GUI的应用程序。主GUI有一个按钮,一旦按下,它就会调用另一个GUI。问题是,一旦按下该按钮并出现新的GUI,两个窗口都会挂起。Swing - 多个GUI

我一直在调查SwingUtilities.invokeLater但我不能用它来创建第一个GUI,因为我将它传递给一个对象,我不希望它成为编译器要求的“最终” 。

第一个GUI与创建:

private void challengeBtnActionPerformed(java.awt.event.ActionEvent evt) { 
    if (board.isVisible()) { 
     board.dispose(); 
     resetComponents(); 
    } else { 
     MainUI gui = new MainUI(player); 
     gui.setVisible(true); 
    } 
} 

你能帮助我,请:

MainUI gui = new MainUI(player); 
gui.setVisible(true); 

第二个与创造的呢?

+2

1)为了更好地提供帮助,请发布[SSCCE](http://sscce.org/)。 2)如果'多个GUI'表示多个'JFrame',那么你已经出错了。首先解决它。问我怎么样! – 2012-01-17 05:08:27

+0

@AndrewThompson是的多个GUI,我的意思是多个JFrames。你是什​​么意思,我“已经出错了”? – DaveQuinn 2012-01-17 05:13:00

+0

为什么你不想让'player'参数成为final? – MockerTim 2012-01-17 05:23:35

回答

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以这样的方式。

UPDATE:

下面的代码应该工作。

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 
    } 
}