2013-06-05 46 views
0

我目前的工作產生井字棋的一個簡單的JFrame/JButton的佈局的Java類。實現ActionListener時,我打算讓選定的JButton將它的標題設置爲「X」或「O」(基於一個布爾語句來判斷它是否輪到X選擇一個JButton)並被禁用(所以它不能在在接下來的回合中)。我創建的當前應用程序執行此操作,但它有時不會更改JButton文本或禁用按鈕,直到我單擊另一個按鈕。當我點擊其中一個JButton時,似乎沒有任何一種粘合順序。我花了幾個小時試圖解決這個問題沒有用。我是如何編寫我的actionPerformed方法或如何將它添加到我的JButton中的問題?的ActionListener:禁用按鈕

下面是代碼我的課:

import javax.swing.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TTT extends JFrame implements ActionListener{ 

    // private fields 
    private JButton[] buttonArray; 
    private JLabel prompt; 
    private boolean turnX; 
    private String letter; 



public TTT() { 
    // Instantiates JFrame window and adds lines to board 
    super.setSize(235, 280); 
    super.setTitle("Tic-Tac-Toe"); 
    // Instantiates JButton array 
    buttonArray = new JButton[9]; 
    // Loop that creates the JButton squares 
    for(int y = 30; y <= 140; y += 55) { 
     for(int x = 30; x <= 140; x += 55) { 
     for(int index = 0; index < buttonArray.length; index++) { 
     buttonArray[index] = new JButton(); 
     buttonArray[index].setSize(50, 50); 
     buttonArray[index].setLocation(x, y); 
     buttonArray[index].addActionListener(this); 
     super.add(buttonArray[index]); 
     } 
    } 
    } 
    prompt = new javax.swing.JLabel("X's TURN"); 
    prompt.setVerticalAlignment(JLabel.BOTTOM); 
    super.add(prompt); 

    turnX = true; 

    super.setVisible(true); 
    } 

public void actionPerformed(java.awt.event.ActionEvent a) { 

     // Calculate whose turn it is 
     if(turnX){ 
      letter = "X"; 
      prompt.setText("O's TURN"); 
      turnX = false;  
     } else if(!turnX){ 
      letter = "O"; 
      prompt.setText("X's TURN"); 
      turnX = true; 
     } 
     JButton pressedButton = (JButton)a.getSource(); 
     pressedButton.setText(letter); 
     pressedButton.setEnabled(false); 
     super.repaint(); 
} 

    public static void main(String[] args) { 
    new TTT(); 
    } 
} 

回答

0

有了這個代碼:(!)

for(int y = 30; y <= 140; y += 55) { 
    for(int x = 30; x <= 140; x += 55) { 
    for(int index = 0; index < buttonArray.length; index++) { 

你加入82 Jbutton將(一個在9組的其他的頂部) 。所以,實際發生的是一個被改變(禁用等),但是在調用重繪時,繪製它們的順序可能會改變,所以觸發ActionListener的那個被繪製在仍然被啓用和空白的8個之下。

您可以糾正這樣的:

... 
int index = 0; // <-- Add this line 
for(int y = 30; y <= 140; y += 55) { 
    for(int x = 30; x <= 140; x += 55) { 
      // <-- remove the third for-loop 
     buttonArray[index] = new JButton(); 
     buttonArray[index].setSize(50, 50); 
     buttonArray[index].setLocation(x, y); 
     buttonArray[index].addActionListener(this); 
     super.add(buttonArray[index]); 
     index++; // <-- increment 'index' 
    } 
} 
... 

您也可以刪除super.repaint()線,因爲它是多餘的。


不直接關係到你的問題,但旋啓式相關的東西應(因各種原因)從Event Dispatching Thread (EDT)被調用。實現這一目標的方法之一,是通過使用SwingUtilities.invokeLater(),所以它可能是一個好主意,以取代new TTT();這個:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     new TTT(); 
    } 
}); 
+0

太謝謝你了!當我讀到我正在給JFrame添加82個按鈕時,我就吼了一聲...... – Saffioti