2017-03-08 7 views
1

問題は、私が説明するほど単純ではありませんが、パラダイムは似ています。だから、このメソッドをwhileループで実行して、xの値が<の間だけ実行し続けるとしましょう。そしてスペースバーが押されたときだけ、xは1だけインクリメントされます。どのように私はそれを正確に行うだろうか?私が書いたことは以下の通りですJava - キーイベントを「リフレッシュ」してwhileループの中で再度呼び出す方法

public void keyPressed(String key){ 
    //assume that x = 0 
    while(x < 100){ 
     if(key.equals("Space")){ 
      x += 1; 
     } 
    } 
} 

私が知っている、私は知っています。私のコードは、スペースバーをたった1回押すだけで、連続的にxをインクリメントします。これは、キーの値がループ全体で同じになるためです。何が行われる必要があるかは、キーの値を「リフレッシュ」し、スペースバーを押して別のキーイベントをトリガーすることです。私はそれをどうやって行うのか分かりません。どんな提案も大歓迎です。ループはあなたがたKeyEventをリッスンスレッドから別のスレッドで実行する必要があります

public void keyPressed(KeyEvent e) { 
    String key = KeyEvent.getKeyText(e.getKeyCode()); 
    for (GameObject go : gameobjects) { 
     go.keyPressed(key); 
    } 
} 
+1

これは、ゲームを作成するように見えます。何らかのフレームワークを使用していますか? – Nessuno

答えて

1

keyPressedは、次のように別のクラスで定義されています。 KeyEventリスナーを呼び出すと、ループの各反復でスレッドがそれをテストできるように、他のクラスのプロパティを変更する必要があります。

import java.util.concurrent.atomic.AtomicInteger; 

public class MainLoop { 

private final AtomicInteger x = new AtomicInteger(0); 

public void startLoop() { 
    Runnable runnable =() -> { 
     while (x.get() < 100) { 
      // Do stuff... 
     } 
    }; 

    // start the thread 
    new Thread(runnable).start(); 
} 

public void keyPressed(String key) { 
    if (key.equals("Space")) { 
     x.incrementAndGet(); 
    } 
} 

} 

public class KeyListener { 

public void keyPressed(KeyEvent e) { 
    String key = KeyEvent.getKeyText(e.getKeyCode()); 
    for (GameObject go : gameobjects) { 
     go.keyPressed(key); 
    } 
} 

} 

スレッド間で共有プロパティはスレッドセーフでなければならないことに注意してください、より良いスレッドを管理するには

(文字列のために、あなたはは、java.util.concurrent.atomicパッケージのAtomicReferenceクラスを使用することができます) Oracle Executors Tutorial

関連する問題