Вызываете actionlistener из другого класса или как-то упорядочить несколько actionlisteners, которые размещены на одной кнопке? - PullRequest
0 голосов
/ 25 мая 2018

Для моего проекта «крестики-нолики» у меня есть список действий для кнопок в моем классе TTTBoard, который обновляет счет, когда игрок выиграл, и список действий в графическом интерфейсе, который обновляет табло для отображения результатов.

Однако, когда я запускаю код, кажется, что actionlistener для GUI идет раньше, чем actionlistener для TTTBoard.Так что получается, что я всегда один клик позади.

Вот как это выглядит на консоли введите описание изображения здесь

Вот часть моего кода TTTBoard

public class TTTBoard extends JPanel implements ActionListener
{
    private TTTSquare[][] square;
    private ScoreBoard gameScore;
    private Random generator = new Random();
    private int turn = 0;
    private int a = 0;
    private int p = 0;
    public TTTBoard(ScoreBoard sb)
    {
        super(new GridLayout(3,3));
        square = new TTTSquare[3][3];
        for(int r = 0; r < 3; r++)
        {
            for(int c = 0; c < 3; c++)
            {
                square[r][c] = new TTTSquare();
                add(square[r][c]);
                square[r][c].addActionListener(this);
            }
        }
        gameScore = sb;
    }
    public void actionPerformed(ActionEvent e)
    {
        gameScore = new ScoreBoard();
        TTTSquare btn = (TTTSquare)e.getSource();
        btn.clicked();
        turn++;
        if(winningMove(1))
        {
            a++;
            gameScore.setPlayer(a);
        }
        else
        {
            if(turn < 5)
            {
                computersTurn();
                if(winningMove(2))
                {
                    p++;
                    gameScore.setComputer(p);
                }
            }
            else
            {

            }
        }
        System.out.println("GameScore From Loop "+gameScore.getPlayer()+" , "+gameScore.getComputer());
        System.out.println();
        gameScore.update();
    }
}

Вот мойКод GUI

public class GUI extends JFrame
{
    private TTTBoard board;
    private ScoreBoard score;
    private JButton btnGame;
    private JButton btnReset;
    public GUI()
    {
        super();
        setLayout(new BorderLayout());

        JPanel pnlSouth = new JPanel();
        score = new ScoreBoard();
        pnlSouth.add(score);

        board = new TTTBoard(score);
        add(board,BorderLayout.CENTER);

        for(int r = 0; r < 3; r++)
        {
            for(int c = 0; c < 3; c++)
            {
                board.getSquare(r,c).addActionListener
                (
                    new ActionListener()
                    {
                        public void actionPerformed(ActionEvent e)
                        {
                            System.out.println("GameScore From GUI "+board.getGameScore().getPlayer()+" , "+board.getGameScore().getComputer());
                            score.setPlayer(board.getGameScore().getPlayer());
                            score.setComputer(board.getGameScore().getComputer());
                        }
                    }   
                );
            }
        }

        }
}

Я мог думать только о двух способах решения этой проблемы, и это либо каким-либо образом упорядочить два события действия, которые происходят на кнопке, так, чтобы событие действия от TTTBoard прошло до этого вGUI

Или путем вызова actionlistener из TTTBoard в классе GUI, может быть что-то вроде внизу:

        for(int r = 0; r < 3; r++)
        {
            for(int c = 0; c < 3; c++)
            {
                board.getSquare(r,c).addActionListener
                (
                    new ActionListener()
                    {
                        public void actionPerformed(ActionEvent e)
                        {
                            /*
                            for(int r = 0; r < 3; r++)
                            {
                                for(int c = 0; c < 3; c++)
                                {
                                    board.getSquare(r,c).addActionListener(SOMEHOW CALL ACTIONLISTENER FROM ANOTHER CLASS);
                                }
                            }
                            */
                            System.out.println("GameScore From GUI "+board.getGameScore().getPlayer()+" , "+board.getGameScore().getComputer());
                            score.setPlayer(board.getGameScore().getPlayer());
                            score.setComputer(board.getGameScore().getComputer());
                        }
                    }   
                );
            }
        }

Я полагаю, что мое последнее средство - принести огромный кусок кода из TTTBoardКласс в GUI и посмотреть, работает ли он тогда, но я действительно не хочу этого делать.Любая помощь, совет, предложения необходимы и приветствуются.

Большое спасибо

...