java - 从操作监听器获取 JPanel 中按钮数组的值时遇到问题

标签 java swing awt actionlistener

我正在尝试向 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);
    }

}

按钮类

创建一个 XO 图像图标。有一个 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/

相关文章:

java - 检测 jpanel 焦点的变化

java - AWT TextArea 似乎将 cr-lf 序列计为一个字符

java - 打印整个程序布局

java - DropWizard 本身是否支持计划任务?

java - 在 Java 中格式化货币

java - 如何在 JPanel 中的 JScrollPane 中对齐 JPanel 中的 Jbutton

linux - 在 linux X11 问题中使用 java.awt 库

java - 如何使用 Java 和 JNA 写入 Windows 事件日志

java - 如何在一个事务中调用多个DAO函数

java - 登录: How to separate logs for each "user" in a web application?