2015-04-27 74 views
0

好吧,我正在創建一個Tic Tac Toe GUI。我目前有一個3x3按鈕的工作框架,將更改爲X或O.我的問題是實現按鈕頂部的JLabel。該標籤會跟蹤是誰轉身,並會從「O's turn」或「X's turn」中改變,但我似乎無法讓JLabel更新(只會噴出錯誤)。這裏是我的代碼的一部分,展示瞭如何實現這一點。程序運行良好,但一旦我添加(turn.setText(「O's turn」);)我得到錯誤。在ActionEvent中更改JLabel的文本

任何反饋,爲什麼這可能不工作,將不勝感激。

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class TicTacToe extends JFrame { 

    XOButton[] xob = new XOButton[9]; 
    private JLabel turn; 

    public static int state; 

    public TicTacToe() { 
     super("TicTacToe"); 

     //add XOButtons to panel 
     JPanel center = new JPanel(); 
     state = 0; 

     JLabel turn = new JLabel("X's turn"); 

     center.setLayout(new GridLayout(3, 3, 2, 2)); 
     //action listener 
     ButtonListener bl = new ButtonListener(); 
     for (int i = 0; i < 9; i++) { 
      xob[i] = new XOButton(); 
      xob[i].addActionListener(bl); 
      center.add(xob[i]); 
     } 

     //add panel to frame 
     setLayout(new BorderLayout()); 
     add(center, BorderLayout.CENTER); 
     add(turn, BorderLayout.NORTH); 

    } 



    //inner action listener class 
    private class ButtonListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      for (int i = 0; i < 9; i++) { 
       if(ae.getSource() == xob[i] && xob[i].getState() == XOButton.NONE && state == 0) { 
        xob[i].setState(XOButton.X); 
        state = 1; 
        //turn.setText("O's turn"); 

       } else if(ae.getSource() == xob[i] && xob[i].getState() == XOButton.NONE && state == 1) { 
        xob[i].setState(XOButton.O); 
        state = 0; 
       } 
      } 
     } 
    } 
} 
+1

'「...我得到錯誤」' - 你會想告訴我們這些錯誤以及指出哪一行導致它。否則,我們很難理解你的問題可能是什麼。 –

+0

請參閱編輯以回答。你正在遮蔽'turn'變量,解決方案不是這樣做的。 –

回答

4

猜測:您的錯誤是NullPointerException,因爲turn爲空。解決方案:不要影響變量。換句話說,你在構造函數中重新聲明瞭轉向變量,將字段留空。

例如,

public class TicTacToe extends JFrame{ 
XOButton[] xob = new XOButton[9]; 
private JLabel turn; 

public static int state; 

public TicTacToe() { 
    super("TicTacToe"); 

    //add XOButtons to panel 
    JPanel center = new JPanel(); 
    state = 0; 

    JLabel turn = new JLabel("X's turn"); // **** you're re-declaring turn here! 

更好:

public class TicTacToe extends JFrame{ 
XOButton[] xob = new XOButton[9]; 
private JLabel turn; 

public static int state; 

public TicTacToe() { 
    super("TicTacToe"); 

    //add XOButtons to panel 
    JPanel center = new JPanel(); 
    state = 0; 

    turn = new JLabel("X's turn"); // **** Note the difference? 

在未來,如果你有類似的問題,請張貼整個錯誤消息,並表示這行拋出,因爲它會幫助我們異常非常!

+0

謝謝,現在完美。我沒有添加這個錯誤,只是因爲它和我的代碼一樣長,但我會記住將來會更具描述性。 – Devos

+1

@Devos:不要擔心錯誤會很長 - 將它添加到代碼標籤中,意味着將它添加到您的問題中,突出顯示它,然後按代碼按鈕以便縮進並以代碼形式呈現。這樣我們可以儘可能多地滾動瀏覽。但也要注意通過一些明顯的手段來表明,或許一個明顯的評論'// ******* here !!!! ****'發生錯誤的地方。 –