Reputation: 71
Good Morning, i'm implementing the GUI for a game and when i play the game for sometime i get an endless number of this exception then the game freezes, any help on what is the problem or how to fix it is much appreciated
here is the code:
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);
}
}
The only exception massage i get only an endless number of it at java.awt.AWTEventMulticaster.mouseExited(Unknown Source)
im pretty sure that the board class is 100% as it is made by the teacher assistants in our university and it passed all the test
Thanks in advance
Upvotes: 2
Views: 1869
Reputation: 285405
I see a potential source of problems:
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 !!
}
}
I was keyed in that your error involved Swing mouse handling. You appear to be adding a MouseListener multiple times to your components. So picture this, when the MouseListener is called, it adds another MouseListener to the same component. With the next mousepress, the MouseListener will be called twice and two MouseListeners will be added, then 4, then 8, then 16, ... This will lead to a geometric increase in the number of MouseListeners added whenever one is called, and will soon overwhelm your system.
Solution:
Upvotes: 4