Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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 如何从action listener运行具有多个线程的方法_Java_Multithreading_Swing_Thread Safety - Fatal编程技术网

Java 如何从action listener运行具有多个线程的方法

Java 如何从action listener运行具有多个线程的方法,java,multithreading,swing,thread-safety,Java,Multithreading,Swing,Thread Safety,当点击按钮时,JFrame和action listener会冻结并打开空白的白色屏幕,而不是我的象棋游戏 private static void createAndShowGui() { frame = new JFrame(); frame.getContentPane().setForeground(new Color(153, 153, 153)); frame.getContentPane().setBackground(new Color(51, 51, 51)); frame.set

当点击按钮时,JFrame和action listener会冻结并打开空白的白色屏幕,而不是我的象棋游戏

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;
//无限循环永远不存在 while(true){


问题是游戏不是作为一个单独的线程启动的

您必须从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();
}

我强烈建议使用LayoutManager。当您切换到不同的机器、不同的操作系统等时,它们可以让您的生活更轻松。如果您确实需要,最好创建自己的LayoutManager,而不是处理空的LayoutManager。
public void actionPerformed(ActionEvent e) {
   // generate Game
   GamePlay game = new GamePlay(1);
   // generate Thread
   Thread thread = new Thread(game);
   // run thread
   thread.run();
}