我正在尝试在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
// ...
}
答案 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
值是什么。