cdLegend
cdLegend

Reputation: 71

at java.awt.AWTEventMulticaster.mouseExited(Unknown Source) occur after using the GUI for several times

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

Answers (1)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

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:

  1. Don't do this. Don't add the same listener to a component inside of its listener code.
  2. Again, don't use MouseListeners at all for JButtons. Use ActionListeners.

Upvotes: 4

Related Questions