2012-01-17 71 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 
    } 
}