Java - 如何 "refresh" 按键事件并在 while 循环中再次调用它

Java - How to "refresh" key event and call it again inside a while loop

问题并不像我描述的那么简单,但范例有点相似。所以,假设我用一个 while 循环创建了这个方法,只要 x < 100 的值就会保持 运行。只有按下 space 栏时 x 才会递增 1。我该怎么做呢?

我写的是这样的:

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

我知道,我知道。即使只按一下 space 栏,我的代码也会连续递增 x。那是因为 key 的值在整个循环中将保持不变。需要做的是"refresh"键的值,按下space栏触发另一个按键事件。我不知道该怎么做。任何建议将不胜感激。

keyPressed在另一个class中定义为:

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

循环必须 运行 在与侦听 KeyEvent 的线程不同的线程中。 调用 KeyEvent 侦听器时,必须更改另一个 class 中的 属性,以便线程可以在循环的每次迭代中测试它​​。

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 class)

要管理线程,最好使用 JDK 线程执行器 Oracle Executors Tutorial