【发布时间】:2012-08-30 01:21:16
【问题描述】:
我正在用 java 编写一个国际象棋程序。到目前为止一切都很好,但我在更新我的 UI 时确实遇到了问题。
这是来自 ChessBoard 类的代码的 sn-p,它扩展了 JPanel。当用户尝试移动时调用它:
if ( isLegalMove( aMove ) ) { // If the move's legal
makeMove( aMove ); // Make that move
select = null; // Reset some info
drag = null;
toggleTurn(); // Change turns
generateMoves( 0 ); // Get legal moves for CPU
repaint(); // Redraw board
thread.run(); // Run chess algorithm
}
线程正在我的 ChessBoard 实例上调用“运行”。找到移动的算法可能需要几秒钟来决定移动。
我希望我的 UI 更新以反映用户的移动,然后运行算法。这就是我在单独的线程上运行算法的原因。但是我的用户界面在计算机也采取行动之前不会更新。
因此,如果用户单击空间将棋子发送到那里,屏幕会冻结,然后棋子突然移动了,但计算机也移动了,又轮到玩家了。
任何帮助将不胜感激。
【问题讨论】:
-
你确定运行时间长的代码在线程中吗?还是在
generateMoves(0)?使用调试器只需几秒钟即可找出答案。
标签: java multithreading user-interface background chess