gpt4 book ai didi

java - 在多次使用 GUI 后发生在 java.awt.AWTEventMulticaster.mouseExited(Unknown Source)

转载 作者:行者123 更新时间:2023-11-30 07:17:02 25 4
gpt4 key购买 nike

早上好,我正在为一个游戏实现 GUI,当我玩这个游戏一段时间后,我遇到了无数个异常,然后游戏就死机了,任何关于问题是什么或如何解决它的帮助都是很多赞赏

代码如下:

public class BoardFrame extends JFrame implements MouseListener {


private void boardWithoutCheckers() {


for(int i=0; i<8; i++) {
for(int j=0; j< 8; j++) {
if(((i + j) % 2) == 0){
boardFrame[i][j] = new LightGrayButton();

}
else {
boardFrame[i][j] = new DarkGrayButton();
}
boardFrame[i][j].addMouseListener(this);

this.getContentPane().add(boardFrame[i][j]);
}

}
this.setVisible(true);
}



@Override
public void mouseClicked(MouseEvent e) {



count++;
if(count == 1){
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if(e.getSource().equals(boardFrame[i][j])){
possibleMoves = board.getPossibleMoves(new Point(j,i));
for (int k = 0; k < possibleMoves.size(); k++) {

Point temp = new Point(possibleMoves.get(k).getX(),possibleMoves.get(k).getY());
boardFrame[temp.getY()][temp.getX()].setBackground(new Color(99,204,94,50));
}
firstClick = new Point(j, i);
break;
}
}
}

}
if(count == 2){

for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if(e.getSource().equals(boardFrame[i][j])){


for (int k = 0; k < possibleMoves.size(); k++) {
if(possibleMoves.get(k).getX() == j && possibleMoves.get(k).getY() == i){
if(board.getTurn() == 1){
boardFrame[i][j].setIcon(null);
boardFrame[i][j].setIcon(new ImageIcon(Earth));
boardFrame[firstClick.getY()][firstClick.getX()].setIcon(null);
board.move(firstClick, new Point(j,i));



}
else if(board.getTurn() == 2){
boardFrame[i][j].setIcon(null);
boardFrame[i][j].setIcon(new ImageIcon(Mars));
boardFrame[firstClick.getY()][firstClick.getX()].setIcon(null);
board.move(firstClick, new Point(j,i));

break;
}


}

}
}
}

}

count=0;
possibleMoves = new ArrayList<Point>();
for(int i=0; i<8; i++) {
for(int j=0; j< 8; j++) {
if(((i + j) % 2) == 0){
boardFrame[i][j].setBackground(new Color(15, 81, 162));

}
else {
boardFrame[i][j].setBackground(new Color(77, 77, 77));
}
boardFrame[i][j].addMouseListener(this);
}

}
}

if(board.isGameOver()){
JLabel winner = new JLabel("we have a winner");
this.getContentPane().add(winner);
}




}

唯一的异常(exception)按摩我只得到了无数次 在 java.awt.AWTEventMulticaster.mouseExited(未知来源)

我很确定董事会类(class)是 100% 的,因为它是由我们大学的助教制作的,并且通过了所有测试

提前致谢

最佳答案

我看到了潜在的问题来源:

     for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (((i + j) % 2) == 0) {
boardFrame[i][j].setBackground(new Color(15, 81, 162));

} else {
boardFrame[i][j].setBackground(new Color(77, 77, 77));
}
boardFrame[i][j].addMouseListener(this); // !! here !!
}

}

我了解到您的错误涉及 Swing 鼠标处理。您似乎多次向组件添加 MouseListener。想象一下,当调用 MouseListener 时,它会向同一个组件添加另一个 MouseListener。随着下一次鼠标按下,MouseListener 将被调用两次并添加两个 MouseListener,然后是4,然后是8,然后是16 ,...这将导致每次调用时添加的 MouseListener 数量呈几何级数增长,并且很快就会使您的系统不堪重负。

解决方案:

  1. 不要这样做。不要在组件的监听器代码中添加相同的监听器。
  2. 再次声明,根本不要对 JButton 使用 MouseListeners。使用 ActionListeners。

关于java - 在多次使用 GUI 后发生在 java.awt.AWTEventMulticaster.mouseExited(Unknown Source),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16465107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com