Ich bin sehr neu in der Codierung (2 Monate) und ich habe versucht, Tic-Tac-Toe in Java zu machen. Ich bin etwas über meinem Kopf, aber ich habe es mit Swing geschafft. Mein Hauptproblem ist in der button1
Klasse. Ich würde die getText()
Methode verwenden, aber am Ende brauchte ich es nicht oder so dachte ich. Ich habe versucht, es zu löschen, aber wie sich herausstellt, schalten meine Tictactoe-Tasten Buchstaben nicht ohne es um. Der Compiler sagte mir, es überschreibt AbstractButton
's getText()
Methode, aber ich sehe nicht, warum das wichtig sein sollte, da ich es nie wirklich verwendet habe, dachte ich. Ich denke, es ist vielleicht ein Scope-Problem, das dadurch gehandhabt wird, dass es irgendwie überschrieben wird, aber ich bin mir nicht sicher. Ich versuchte, die Variable text
zu verwenden, um die Schaltfläche mit setText()
zu aktualisieren, und das scheint nicht zu funktionieren, wie ich dachte, dass es sollte. Ich verstehe auch nicht, warum das 3 mal 3 Rasterlayout meistens richtig funktioniert, aber manchmal ist die Anzahl der hinzugefügten Buttons falsch.Brauchen Sie Hilfe zu verstehen, wie ein bestimmter Getter mein Programm beeinflusst
So funktioniert das Programm (meistens), aber ich verstehe nicht vollständig, wie die button1
Klasse funktioniert.
TicTacToe.java
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class TicTacToe extends JFrame {
public static void main(String[] args) {
JFrame window = new JFrame("Tic-Tac-Toe");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
window.setSize(600, 600);
window.setLayout(new GridLayout(3, 3));
ArrayList<button1> buttonArrayList = new ArrayList<>(9);
for (int i = 0; i < 9; i++) {
button1 newbutton = new button1();
buttonArrayList.add(newbutton);
window.add(buttonArrayList.get(i));
}
}
}
button1.java
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
public class button1 extends JButton {
int value = 0;
String text = "";
public button1() {
class ButtonAction extends AbstractAction {
public ButtonAction() {}
@Override
public void actionPerformed(ActionEvent Switcher) {
System.out.println(text + " " + value);
value++;//value is a relic from earlier attempts that i just felt like keeping.
if (text.equals("O")) {
text = "X";
} else if (text.equals("X")) {
text = "";
} else if (text.equals("")) {
text = "O";
}
}
}
this.setAction(new ButtonAction());
this.setText(text);
this.setFont(new Font("Arial",Font.PLAIN,120));
}
public String getText()// <----culprit
{
return text;
}
}
Wenn ich Ihren Vorschlag richtig verstehe, sagen Sie, dass Sie den Text auf der Schaltfläche von der "actionperformed" -Methode festlegen. Wenn das so ist, dann wollte ich das von Anfang an tun, aber ich wusste nicht, wie ich es richtig umsetzen sollte. Ich weiß es immer noch nicht, ich weiß, dass ich 'this' dort nicht benutzen kann. Würde es dir etwas ausmachen, mir zu zeigen, wie das geht? Danke btw – ApatheticWrath
@ApathéticWrath, machte eine Bearbeitung der Antwort zu versuchen, zu veranschaulichen, wie Sie die ausgewählte Schaltfläche aus der 'actionPerformed'-Methode zu erhalten. – KevinO
Es wird mich ein bisschen brauchen, um mich vollständig in diese neue Klasse einzuwickeln, aber ich denke, ich werde es bekommen. Die einzige Sache, die mich abstößt, ist genau das, was diese Zeile bedeutet und tut 'JButton btn = (JButton) e.getSource();'. Es verweist auf die Schaltfläche, in der es sich befindet, und setzt Dinge über eine lokale Instanz der Schaltfläche? – ApatheticWrath