Для моего проекта «крестики-нолики» у меня есть список действий для кнопок в моем классе 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 и посмотреть, работает ли он тогда, но я действительно не хочу этого делать.Любая помощь, совет, предложения необходимы и приветствуются.
Большое спасибо