如何在不同的点击量java上更改按钮

时间:2018-04-29 22:14:28

标签: java jbutton actionlistener

我正在尝试在java中制作一个游戏,如果你点击一个按钮,一旦它变成红色,如果你点击它两次它变成蓝色,但我遇到一个问题,当我点击一个方块一次它变成红色,如果我一旦它变成蓝色就会点击另一个,当我想要一次隔离每个方块的效果时(例如,如果我点击一个方块一旦它的红色,再点击另一个蓝色两次,另一个方块一旦红色) 。我还希望它在3次点击后重置。

到目前为止,这是我的行动听众

JFrame frame = new JFrame(); //creates frame
JButton[][] grid; //names the grid of buttons

int clicked = 0;

public ButtonGrid(int width, int length) { //constructor
    frame.setLayout(new GridLayout(width, length)); //set layout
    grid = new JButton[width][length]; //allocate the size of grid
    for(int y = 0; y < length; y++) {
        for(int x = 0; x < width; x++) {
            grid[x][y] = new JButton(); //creates a button
            grid[x][y].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        if(clicked == 0) {
        ((JButton)e.getSource()).setBackground(Color.red);
                            clicked++;
                        } else if(clicked == 1) {
        ((JButton)e.getSource()).setBackground(Color.blue);
                            clicked++;
                        }
                    }
            });
            frame.add(grid[x][y]); //adds new button to grid
        }
    }
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack(); //sets appropriate size for frame
    frame.setVisible(true); //makes frame visible
// ...
}

3 个答案:

答案 0 :(得分:3)

在您当前的实现中,clicked是父类的实例字段,您的所有按钮/ ActionListener都在使用。

相反,您需要隔离该属性,以便可以更好地与单个按钮关联。

现在,您可以创建一个extends来自JButton的自定义类,但是恕我直言,这有点沉重,并将您锁定在一个用例中。就个人而言,我希望实现ActionListener的具体实现,以提供这种副作用。

例如......

public class CounterActionListener implements ActionListener {
    private int counter;

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source instanceof JButton) {
            JButton button = (JButton)source;
            clicked++;
            if(clicked == 0) {
                button.setBackground(Color.red);
            } else if(clicked == 1){
                button.setBackground(Color.blue);
            }
        }
    }
}

然后在您的代码中,您只需将侦听器应用于按钮,例如......

grid[x][y] = new JButton(new CounterActionListener());

您也可以通过使用“委托”来实现这一点,“委托”实际上根据可以在模型中保存的点击次数执行所需的操作,但这超出了问题的范围;)< / p>

答案 1 :(得分:1)

您为所有人点击了一个全局广告。因为这些行动不是孤立的。

int clicked = 0;

不应该在课堂上。

答案 2 :(得分:0)

您的问题是clicked附加到框架,而不是按钮。这意味着整个应用程序只有clicked的单个值。

这里最简单的方法是编写一个新的GregoryWeigelButton(或其他)extends JButton并且在其中有一个int clicked=0(可能是一个getter和setter)。然后,只需检查特定按钮clicked值是什么。