【发布时间】: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