2010-08-24 66 views
1

我有一個JFrame,它內部有一個BottomPanel(我製作的擴展了JPanel的類)。 在JPanel內部是另一個名爲DicePanel的JPanel(它再次擴展了JPanel)。從JFrame監聽對內部JPanel的操作

在DicePanel中有一個名爲'End Turn'的按鈕,點擊時應該結束玩家當前轉向棋盤遊戲的基礎。我想以某種方式從我的JFrame中監聽來自DicePanel的buttonClicked事件。

我該怎麼做?

編輯:現在我有

for (Player p : f.playerList) { 
    int diceRoll = dice.roll(); 
    System.out.println(p.move(diceRoll)); 
    System.out.println(p.getCurrentCell()); 
    System.out.println(diceRoll); 
    f.bottomPanel.dice.setDice(dice.getDice1(), dice.getDice2()); 
    while (true) { 
     try { 
      break; 
      System.out.println("Waiting"); 
      Thread.sleep(2000); 
     } catch (Exception e) { 
     } 
    } 
} 
+0

從評論中移植代碼的可讀性;如果不正確請回復。 – trashgod 2010-08-25 00:44:49

回答

0

爲什麼?

我的意思是,你可以通過在你的JFrame中定義按鈕並傳遞它,直到你可以把它放在DicePanel中,但是爲什麼你需要在JFrame中添加一個監聽器呢?

+0

好吧,所以遊戲運行正常,它是一個玩家轉向。當點擊結束按鈕時,我想結束輪到。基本上,我需要做一個while循環,說'雖然他沒有結束*等待*'。當按鈕被按下時,我需要設置一個布爾值或者什麼來讓Turn()方法知道他的回合已經結束。 – Sean 2010-08-24 22:51:05

+0

現在我有: \t \t爲(玩家P:f.playerList){ \t \t \t INT diceRoll = dice.roll(); \t \t \t System.out.println(p.move(diceRoll)); \t \t \t System.out.println(p.getCurrentCell()); \t \t \t System.out.println(diceRoll); \t \t \t f.bottomPanel.dice.setDice(dice.getDice1(),dice.getDice2()); \t \t \t \t \t \t而(真){ \t \t \t \t嘗試{ \t \t \t \t \t //突破; \t \t \t \t \t System.out。的println( 「等待」); \t \t \t \t \t // Thread.sleep(2000); \t \t \t \t} \t \t \t \t趕上(例外五){ \t \t \t \t} \t \t \t} \t \t} – Sean 2010-08-24 22:51:29

+0

但這只是使無限循環,並且不顯示的幀(因爲塗料()方法從來沒有被系統調用,我猜是因爲循環)。也許我需要製作另一個線程 - 一個用於Turn方法,另一個用於GUI? – Sean 2010-08-24 22:53:38

0

可以使用setDefaultButton()「當UI定義的激活事件(通常爲輸入鍵)在根窗格不管按鈕是否具有鍵盤焦點發生時將被激活」。

JFrame f = new JFrame("Dice Game"); 
JButton b = new JButton("End Turn"); 
f.getRootPane().setDefaultButton(b); 

這裏是一個非常簡單的example表明您如何架構你的遊戲,以避免無限循環,而不訴諸多個線程。另外,至少在輸出的某些輸出的情況下發現異常是個不好的主意。 e.printStackTrace()