Referenz angeklickten JButton im inneren ActionListener
Ich versuche zu schreiben ein Tic Tac Toe Programm mit swing, aber ich glaube, ich habe einige Schwierigkeiten. In meinem anonyme innere Klassen, die ich versuchen, die actionListener für jeden meiner buttons, aber ich habe Probleme bei der Suche die Art oder die variable, die mir erlauben wird, verweisen die Schaltflächen, und legen Sie Sie entweder X oder Y. ich habe versucht, e.getSource().setText() in meiner anonymen Klassen, aber kam zurück mit Fehlern. Irgendwelche Gedanken?
Danke!
Alex
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TicTacToe {
public JFrame frame;
public JLabel label;
public JPanel panel;
public static int counter;
public void go()
{
frame = new JFrame("TicTacToe");
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
panel.setLayout(new GridLayout(3,3,10,10));
frame.add(BorderLayout.CENTER, panel);
label= new JLabel("TIC TAC TOE");
frame.add(BorderLayout.NORTH, label);
;
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 1");
JButton button3 = new JButton("Button 1");
JButton button4 = new JButton("Button 1");
JButton button5 = new JButton("Button 1");
JButton button6 = new JButton("Button 1");
JButton button7 = new JButton("Button 1");
JButton button8 = new JButton("Button 1");
JButton button9 = new JButton("Button 1");
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
}
});
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
}
});
button3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
}
});
button4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
}
});
button5.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
}
});
button6.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
}
});
button7.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
}
});
button8.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
}
});
button9.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
}
});
panel.add(button1);
panel.add(button2);
panel.add(button3);
panel.add(button4);
panel.add(button5);
panel.add(button6);
panel.add(button7);
panel.add(button8);
panel.add(button9);
frame.setVisible(true);
panel.setVisible(true);
}
public static void main(String[] args)
{
TicTacToe gui = new TicTacToe();
gui.go();
}
}
InformationsquelleAutor Amloelxer | 2013-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erinnern,
ActionListener
verwendet werden können, auf eine Anzahl von unterschiedlichen Arten von Komponenten, so dass die Quellenangabe verallgemeinert. Sie müssen Stimmen, um wieder auf den erwarteten WertWährend ich weiß, Ihr
ActionListener
so wie es da steht kann so ziemlich garantieren, dass die Art der Quelle derObject
wird einJButton
ich nie wie blind in Objekte umwandeln, aber das ist mirEine andere Frage. Was wäre der beste Weg, um den Sieger ermitteln auf diese Weise? Sagen wir mal, wenn ich einen Zähler und haben ((JButton) source).setText("O"); oder ((JButton) source).setText("X");
Eigentlich der beste Weg wäre die Schaffung einer Art von Modell. Dies würde es ermöglichen zu untersuchen und den Zustand von spielen und bestimmen, welche Zellen ausgewählt werden und von wem. Jedes mal, wenn ein Spieler wählt einen button, würde ich ein update des Modells. Teil dieses Prozesses wäre für das Modell zu prüfen, für die Gewinner und Feuer ein geeignetes event
InformationsquelleAutor MadProgrammer
Wenn Ihnen Fehlermeldungen angezeigt werden, dann sollten Sie nach Ihnen, aber ich gehe davon aus, dass es ist, weil Sie nicht behaupten, dass das source-Objekt ist in der Tat eine Schaltfläche. Es gibt zwei einfache Lösungen für das, was Sie tun.
Ersten ist, da Sie nur das hinzufügen einer action-listener für jeden button, können Sie davon ausgehen, dass es das Objekt, dass das action-Ereignis bezieht. Beachten Sie, dass die Taste entweder muss eine Instanz-variable oder final deklariert:
Zweite, würde fix die Ursache des Fehlers, wird durch die Behauptung, dass die ActionEvent-source-Objekt ist in der Tat eine Schaltfläche. Dies erfolgt durch überprüfung der Quelle ist eine Instanz von JButton:
JButton
müssen entweder eine Instanz-variable oderfinal
😉Guter Punkt, danke.
InformationsquelleAutor Kevin Sheehan
Ich ging durch und reinigen Sie Ihren code ein wenig. Ich bin mir nicht ganz sicher, warum Ihr code fehlerhaft war, aber ich bekam keine. Ich schlage vor, Sie haben seit dem common code wieder zu verwenden, wie ich in ein array. Ich habe auch einen
boolean
zwischen den Playern zu wechseln, die auf jeder Schaltfläche klicken.Schließlich, ich schlage vor, die Einrichtung der JFrame im Konstruktor, oder in eine private Methode aufgerufen, die Konstruktor (komplexere user-interfaces, haben möglicherweise eine Menge von code und breaking es ist eine gute Gewohnheit für die Wartbarkeit des Codes), wie ich gezeigt unten.
InformationsquelleAutor Pandacoder