等待,直到玩家在Java中单击一个棋子



实现以下代码的正确方法是什么?我想让takeTurn()方法等待玩家点击网格上与他想要选择的棋子对应的按钮。(Button对象具有实例变量int col, rowextend JButton。)

int selectedCol, selectedRow;
void takeTurn() {
    System.out.print(name + "'s turn. ");
    // Get player to select a piece
    selectedCol = -1;
    selectedRow = -1;
    while (selectedCol == -1 && selectedRow == -1) {
        try {
            wait(500);
        } catch (InterruptedException e) {
        }
    }
    System.out.println(selectedCol + " " + selectedRow);
}
@Override
public void actionPerformed(ActionEvent e) {
    Button b = (Button)e.getSource();
    selectedCol = b.col;
    selectedRow = b.row;
}

运行得到Exception in thread "main" java.lang.IllegalMonitorStateException

在Swing或AWT(或大多数UI框架)中,永远不应该阻塞主事件线程。这将导致您的程序停止,并且看起来已崩溃或挂起。

相反,您需要根据传入事件监视程序的状态。

例如。

  • 下一个用户转向,休息内部变量
  • 用过的点击件。保留对工件的引用
  • 使用点击(有些地方)。如果用户选择了一个工件,那么移动是否有效?等等

只有当还有notify()时,wait()才有意义,所以它总是关于线程之间的通信,需要同步才能正常工作。您的代码似乎缺少基本的等待/通知模型实现。

有一个概念的保护块,它说

线程通常必须协调它们的操作。最常见的协调成语是有人防守的块。这样的块开始于轮询一个必须为真的条件,然后块才能进行

点击此处了解更多信息:http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

我在您的代码中没有看到任何synchronization。对象需要位于synchronized上下文中,wait()才能工作。

创建一个thread并在那里运行代码,然后在那里调用thread.wait()

相关内容

  • 没有找到相关文章

最新更新