Java 从另一个类调用actionlistener,或者以某种方式排列放置在一个按钮上的多个actionlistener?
对于我的tic-tac-toe项目,我在TTTBoard类中有一个按钮的actionlistener,当一个玩家获胜时,它会更新分数;在GUI中有一个actionlistener,它会更新计分板以显示分数 然而,当我运行代码时,GUI的actionlistener似乎在TTTBoard的actionlistener之前。所以我总是落后一步 下面是它在控制台上的外观 这是我的TTTBoard代码的一部分Java 从另一个类调用actionlistener,或者以某种方式排列放置在一个按钮上的多个actionlistener?,java,button,action,actionlistener,tic-tac-toe,Java,Button,Action,Actionlistener,Tic Tac Toe,对于我的tic-tac-toe项目,我在TTTBoard类中有一个按钮的actionlistener,当一个玩家获胜时,它会更新分数;在GUI中有一个actionlistener,它会更新计分板以显示分数 然而,当我运行代码时,GUI的actionlistener似乎在TTTBoard的actionlistener之前。所以我总是落后一步 下面是它在控制台上的外观 这是我的TTTBoard代码的一部分 public class TTTBoard extends JPanel implement
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();
}
}
公共类TTTBoard扩展JPanel实现ActionListener
{
私人TTT广场[][]广场;
私人记分牌游戏分数;
专用随机生成器=新随机();
私人整数回合=0;
私有INTA=0;
私有int p=0;
公共记分板(记分板sb)
{
超级(新网格布局(3,3));
正方形=新的TTT正方形[3][3];
对于(int r=0;r<3;r++)
{
对于(int c=0;c<3;c++)
{
正方形[r][c]=新的TTTSquare();
加(平方[r][c]);
正方形[r][c].addActionListener(此);
}
}
gameScore=sb;
}
已执行的公共无效操作(操作事件e)
{
gameScore=新记分板();
TTTSquare btn=(TTTSquare)e.getSource();
点击();
turn++;
如果(赢棋(1))
{
a++;
gameScore.setPlayer(a);
}
其他的
{
如果(转动<5圈)
{
computersTurn();
如果(赢棋(2))
{
p++;
游戏分数:setComputer(p);
}
}
其他的
{
}
}
System.out.println(“来自循环的GameScore”+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());
}
}
);
}
}
}
}
公共类GUI扩展JFrame
{
私人TTTBoard板;
私人记分牌得分;
私人JButton btnGame;
私人JButton btnReset;
公共图形用户界面()
{
超级();
setLayout(新的BorderLayout());
JPanel pnlSouth=新的JPanel();
分数=新记分板();
pnlSouth.add(分数);
板=新的TTT板(分数);
添加(board、BorderLayout.CENTER);
对于(int r=0;r<3;r++)
{
对于(int c=0;c<3;c++)
{
board.getSquare(r,c).addActionListener
(
新建ActionListener()
{
已执行的公共无效操作(操作事件e)
{
System.out.println(“GUI中的GameScore”+board.getGameScore().getPlayer()+,“+board.getGameScore().getComputer());
score.setPlayer(board.getGameScore().getPlayer());
score.setComputer(board.getGameScore().getComputer());
}
}
);
}
}
}
}
我只能想出两种方法来解决这个问题,或者通过某种方式对按钮上发生的两个动作事件进行排序,以便TTTBoard中的动作事件在GUI中的动作事件之前发生
或者通过在GUI类的TTTBoard中调用actionlistener,可能类似于下面的内容:
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());
}
}
);
}
}
for(int r=0;r<3;r++)
{
对于(int c=0;c<3;c++)
{
board.getSquare(r,c).addActionListener
(
新建ActionListener()
{
已执行的公共无效操作(操作事件e)
{
/*
对于(int r=0;r<3;r++)
{
对于(int c=0;c<3;c++)
{
board.getSquare(r,c).addActionListener(以某种方式从另一个类调用ACTIONLISTENER);
}
}
*/
System.out.println(“GUI中的GameScore”+board.getGameScore().getPlayer()+,“+board.getGameScore().getComputer());
score.setPlayer(board.getGameScore().getPlayer());
score.setComputer(board.getGameScore().getComputer());
}
}
);
}
}
我想我最后的办法是把大量的代码从TTTBoard类带到GUI,然后看看它是否工作,但我真的不想这样做。我们需要并欢迎任何帮助、建议和建议
非常感谢为什么您需要10个
ActionListeners
?有更好的方法吗?我刚开始使用GUI,因为我想为我的最终项目做一些特殊的事情(我正在处理的很多东西对我来说都是新的,所以我不知道我的所有选项),我建议创建一个ActionListener
,其中包含用户执行操作时所需的所有逻辑。我不明白为什么TTTBoard
需要一个。当你点击方格外的棋盘时,会发生什么事吗?:D好的,这就是我接下来要说的。我只是想知道是否有任何快捷方式,我可以使用,这样我就不必再弄乱我的代码。