【发布时间】:2017-03-03 23:03:44
【问题描述】:
大家好,我正在尝试使用 java 创建一个简单的国际象棋游戏。我有一个 [8][8] JButtons 数组的板。我为每个人分配了一个新的 SquareListener,它是一个扩展 BoardListner 的类,它是一个实现 Action Listener 的超类。我想记录当前按下的按钮是否等于最后按下的按钮。我正在存储在超类中按下的 JButton 实例,并在 SqaureListener actionPerformed 方法中引用该实例。这是我为按钮创建的类的示例。
public class SquareListener extends BoardListener {
private int row;
private int column;
public SquareListener(int row, int column){
this.setRow(row);
this.setColumn(column);
}
@Override
public void actionPerformed(ActionEvent ae){
JButton buttonPressed = (JButton) ae.getSource();
if(buttonPressed == super.lastButtonPressed){
System.out.println("This is the button you last pressed");
}else{
System.out.println("This is a new button");
}
super.lastButtonPressed = buttonPressed;
}
这是我存储 isSelecting 数据的超类
public class BoardListener implements ActionListener {
private boolean isSelectingInsteadOfTargeting = true;
JButton lastButtonPressed = new JButton();
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
}
public boolean isSelectingInsteadOfTargeting() {
return isSelectingInsteadOfTargeting;
}
public void setSelectingInsteadOfTargeting(boolean isSelectingInsteadOfTargeting) {
this.isSelectingInsteadOfTargeting = isSelectingInsteadOfTargeting;
}
}
我希望每次按下按钮时都会将该按钮的实例传递给 buttonPressed 并与 BoardListener 中存储的内容进行比较,然后将其打印出来,然后将 buttonPressed 分配给超级成员。相反,我得到的行为是,如果我按下一个按钮,它总是会返回“这是你最后按下的按钮”,即使我在两者之间按下了一个新按钮。我这样做的方式有问题吗?有没有更简单的方法?
这是我存储按钮并将其分配给动作侦听器的附加代码
public Board(boolean _isWhite){
gui = new JPanel(new GridLayout(8,8));
chessBoardSquares = new Square[8][8];
boolean shouldBeWhite = true;
for(int i = 0; i < 8; i++){
for(int j= 0; j < 8; j++){
Square square = new Square(i,j);
square.getButton().addActionListener(new SquareListener(i,j));
if(shouldBeWhite){
square.getButton().setBackground(Color.WHITE);
shouldBeWhite = false;
}else{
square.getButton().setBackground(Color.BLACK);
shouldBeWhite = true;
}
if (j == 7){
shouldBeWhite = !shouldBeWhite;
}
chessBoardSquares[i][j] = square;
gui.add(chessBoardSquares[i][j].getButton());
}
}
BoardFactory boardFactory = new BoardFactory();
if(_isWhite){
updateBoardIconsBasedOnCurrentBoardArray(boardFactory.getBlackStartArray());
}else{
//getblack start array and invoke method to change button icons based on array
}
}
【问题讨论】:
-
您能否将注册侦听器的代码添加到您的按钮。我怀疑每个按钮都有 64 个不同的侦听器。在这种情况下,我认为应该有一个 Board 类,它可以作为静态变量跟踪最近和上一次的按钮点击。
-
刚刚添加了它,让我知道你的想法我显然还有其他一些补充课程,但你可能可以从中得到要点