0

次のコードを実装する適切な方法は何ですか? プレーヤーが選択したいピースに対応するグリッド上のボタンをクリックするのを待つように takeTurn() メソッドを取得したいと考えています。(Buttonオブジェクトにはインスタンス変数int col, rowとがありますextend 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ます。

4

3 に答える 3

3

Swing または AWT (またはほとんどの UI フレームワーク) では、メイン イベント スレッドをブロックしないでください。これにより、プログラムが停止し、クラッシュまたはハングしたように見えます。

代わりに、着信イベントに基づいてプログラムの状態を監視する必要があります。

例えば。

  • 次のユーザーの番、残りの内部変数
  • クリックした部分を使用しました。作品への参照を維持する
  • 中古クリック(どこか)。ユーザーが駒を選択した場合、その手は有効ですか? 等...
于 2013-07-01T05:32:39.143 に答える
1

wait() は、notify() もある場合にのみ意味があるため、常にスレッド間の通信に関するものであり、正しく機能するには同期が必要です。あなたのコードには、基本的な待機/通知モデルの実装が欠けているようです。

Guarded ブロックの概念があります。

多くの場合、スレッドはアクションを調整する必要があります。最も一般的な調整イディオムは、保護されたブロックです。このようなブロックは、ブロックを続行する前に真でなければならない条件をポーリングすることから始まります

詳細はこちら: http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

于 2013-07-01T05:32:29.803 に答える