我正在尝试向 TicTacToe 的 GUI 游戏添加逻辑。游戏类设置了一个按钮面板并按预期工作(我将其代码放在这里以防需要)。我希望在 Button
类中添加一个检查器方法。然而,我有一个巨大的障碍,我想不出解决方案来解决。
我希望检查器方法以某种方式获取在 Button
类的 actionPerformed
方法中分配的特定按钮的值。例如,如果一行中 3 个连续按钮具有相同的值,则根据该值 X 或 O 获胜。我不确定我的设置方式是否允许这样做,但我认为有一种我可能没有考虑的方法。
游戏类
创建按钮数组,按钮是使用 Button
类制作的。
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridLayout;
public class game extends JFrame {
JPanel buttonBoard = new JPanel();
Button buttons[] = new Button [9];
public static void main(String[] args) {
new game();
}
public game() {
super("TicTacToe");
setSize(600, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
buttonBoard.setLayout(new GridLayout(3,3));
for(int i = 0; i < 9; i++) {
buttons[i] = new Button();
buttonBoard.add(buttons[i]);
}
add(buttonBoard);
setResizable(false);
}
}
按钮类
创建一个 X
和 O
图像图标。有一个 ActionListener 来相应地设置按钮。
import javax.swing.JButton;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Button extends JButton implements ActionListener {
ImageIcon x, o;
byte value = 0;
public Button() {
x = new ImageIcon(this.getClass().getResource("x.png"));
o = new ImageIcon(this.getClass().getResource("o.png"));
this.addActionListener(this);
}
public void checker(Button array[]) {
array[i].
}
public void actionPerformed(ActionEvent event) {
value++;
if (value > 2)
value = 0;
switch(value) {
case 0:
setIcon(null);
break;
case 1:
setIcon(x);
break;
case 2:
setIcon(o);
break;
}
}
}
如果需要更多信息,请发表评论。这是我第一次编写 GUI 程序,我正在努力学习,所以如果您有任何提示,我也将不胜感激。
谢谢大家!
最佳答案
我同意上面的评论,最好将逻辑保留在 View 组件之外。为了帮助解决有关获取数组值的原始问题,这里有一个快速示例,根据您提供的代码可能会有所帮助
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game extends JFrame {
JPanel buttonBoard = new JPanel();
Button buttons[] = new Button [9];
boolean playerOne = true;
public static void main(String[] args) {
new Game();
}
public Game() {
super("TicTacToe");
setSize(600, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
buttonBoard.setLayout(new GridLayout(3,3));
final ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Button) {
if (isPlayerOne()) {
((Button) e.getSource()).setValue(1);
} else {
((Button) e.getSource()).setValue(2);
}
nextPlayer();
}
}
};
for (int i = 0; i < 9; i++) {
buttons[i] = new Button(0);
buttons[i].addActionListener(listener);
buttonBoard.add(buttons[i]);
}
add(buttonBoard);
setResizable(false);
}
private boolean isPlayerOne() {
return playerOne;
}
private void nextPlayer() {
playerOne = !playerOne;
}
public class Button extends JButton {
ImageIcon x, o;
int value = 0;
public Button(int initialValue) {
x = new ImageIcon(this.getClass().getResource("x.png"));
o = new ImageIcon(this.getClass().getResource("o.png"));
}
public int getValue() {
return value;
}
public void setValue(final int valueIn) {
value = valueIn;
updatedIcon();
}
private void updatedIcon() {
switch(value) {
case 0:
setIcon(null);
break;
case 1:
setIcon(x);
break;
case 2:
setIcon(o);
break;
}
}
}
}
关于java - 从操作监听器获取 JPanel 中按钮数组的值时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37199715/