【问题标题】:How can i run a method with multiple threads from action listener如何从动作侦听器运行具有多个线程的方法
【发布时间】:2020-01-08 05:03:27
【问题描述】:

单击按钮时带有动作侦听器的 JFrame GUI 冻结并打开空白白屏而不是我的国际象棋游戏

private static void createAndShowGui() {
frame = new JFrame();
frame.getContentPane().setForeground(new Color(153, 153, 153));
frame.getContentPane().setBackground(new Color(51, 51, 51));
frame.setBounds(100, 100, 450, 600);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().setLayout(null);

//当按钮被点击时gui frezze并且调用的方法不起作用

btnSingle = new JButton("Single Player");
        btnSingle.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GamePlay.play(1);
            }
        });
}

//启动国际象棋游戏的其他类的方法在正常调用时工作正常,但从 GUI 调用时则不行

public static void startGame(ChessPlayer p1, ChessPlayer p2,Board board) {


        p1.update(board);
        p2.update(board);

        ChessPlayer[] players = new ChessPlayer[2];
        players[1] = p1.getColor() == 1 ? p1 : p2;
        players[0] = p2.getColor() == 0 ? p2 : p1;

//无限循环永远不会退出 而(真){

            if(board.getCurrentColor() ==1)
                p1.start();
            else
                p2.start();

            if(board.getCurrentColor() ==0)
                p1.stop();
            else 
                p2.stop();

//waits for player to make move before executing
            PieceMove m = players[board.getCurrentColor()].makePieceMove(board);

            board.apply(m);
            p1.update(board);
            p2.update(board);

            if (board.checkMate(players[board.getCurrentColor()].getColor()) || p1.isTimeOut()) {
                if(players[board.getCurrentColor()].getColor()==1){
                    if(board.checkMate(players[board.getCurrentColor()].getColor())) {
                        JOptionPane.showMessageDialog(null, "Checkmate, you Lose!  Player 2 - Black Wins!");

                    }
                    else {
                        JOptionPane.showMessageDialog(null, "Player 2's timer ran out, You Win!!!");

                    }

                    p1.close();
                    p2.close();
                }
                else {
                    if(board.checkMate(players[board.getCurrentColor()].getColor())) {
                        JOptionPane.showMessageDialog(null, "Checkmate, you Win!!! Player 2 - Black Loses!");

                    }
                    else {
                        JOptionPane.showMessageDialog(null, "Your Timer ran out you lose!!  Player 2 - Black Wins!");

                    }
                    p1.close();
                    p2.close();
                }
            }


        }
    }

【问题讨论】:

  • 我强烈建议使用 LayoutManager。当您切换到不同的机器、不同的操作系统等时,它们可以让您的生活更轻松。如果您绝对需要,最好制作自己的 LayoutManager 而不是处理 null 。

标签: java multithreading swing thread-safety


【解决方案1】:

问题在于 GamePlay 没有作为单独的线程启动。

您必须从 Runnable 派生游戏玩法并覆盖 run 方法。

看起来像这样:

public class GamePlay implements Runnable {
   public GamePlay(int param){
      // init your settings here
   }

   public void play(){
      // start Game here
   }

   @Override
   public void run() {
      play();
   }
}

要开始游戏,必须创建一个新线程。

public void actionPerformed(ActionEvent e) {
   // generate Game
   GamePlay game = new GamePlay(1);
   // generate Thread
   Thread thread = new Thread(game);
   // run thread
   thread.run();
}

【讨论】:

    猜你喜欢
    • 2015-07-24
    • 2011-08-21
    • 1970-01-01
    • 2021-03-02
    • 2011-08-07
    • 2021-10-04
    • 2014-09-08
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多