Java 如何从action listener运行具有多个线程的方法
当点击按钮时,JFrame和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
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();
}