Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从另一个类调用actionlistener,或者以某种方式排列放置在一个按钮上的多个actionlistener?_Java_Button_Action_Actionlistener_Tic Tac Toe - Fatal编程技术网

Java 从另一个类调用actionlistener,或者以某种方式排列放置在一个按钮上的多个actionlistener?

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

对于我的tic-tac-toe项目,我在TTTBoard类中有一个按钮的actionlistener,当一个玩家获胜时,它会更新分数;在GUI中有一个actionlistener,它会更新计分板以显示分数

然而,当我运行代码时,GUI的actionlistener似乎在TTTBoard的actionlistener之前。所以我总是落后一步

下面是它在控制台上的外观

这是我的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();
    }
}
公共类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好的,这就是我接下来要说的。我只是想知道是否有任何快捷方式,我可以使用,这样我就不必再弄乱我的代码。