2013-06-05 5 views
0

Je travaille actuellement sur une classe Java qui produit une simple disposition JFrame/JButton de Tic-Tac-Toe. En implémentant ActionListener, j'ai voulu que le JButton sélectionné positionne son titre sur "X" ou "O" (basé sur une déclaration booléenne indiquant si X est ou non choisi un JButton) et devient désactivé (donc il ne peut pas être joué sur en haut dans les tours suivants). L'application en cours que j'ai créée le fait, mais elle ne modifie parfois pas le texte de JButton ou ne le désactive pas jusqu'à ce que je clique sur un autre bouton. Il ne semble y avoir aucune sorte d'ordre cohérent auquel cela se produit lorsque je clique sur l'un des boutons JButtons. J'ai passé des heures à essayer de résoudre ce problème sans succès. Y at-il un problème avec comment j'ai codé ma méthode actionPerformed ou comment je l'ai ajouté à mon JButtons?ActionListener: Désactiver les boutons

Voici le code à ma classe:

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(); 
    } 
} 

Répondre

0

Avec ce code: (!)

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

Vous ajoutez 82 JButton (l'un sur l'autre dans les groupes de 9) . Donc, ce qui se passait réellement était que l'on changeait (désactivé etc), mais en appelant repeindre, l'ordre de les peindre pouvait changer, donc celui dont ActionListener était déclenché était peint sous l'un des 8 qui étaient encore activés et vides.

Vous pouvez corriger comme ceci:

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

Vous pouvez également supprimer la ligne super.repaint(), car il est redondant.


pas directement lié à votre problème, mais Swing de choses liées devraient (pour diverses raisons) être appelé de la Event Dispatching Thread (EDT). Une façon d'y parvenir, est à l'aide SwingUtilities.invokeLater(), il pourrait être une bonne idée de remplacer new TTT(); par ceci:

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

Merci beaucoup! J'ai lâché quand j'ai lu que j'ajoutais 82 boutons au JFrame ... – Saffioti