Java - 如何“刷新”键事件并在while循环中再次调用它

时间:2017-03-08 13:02:27

标签: java actionlistener keyevent

问题并不像我将要描述的那么简单,但范式有点类似。所以,假设我使用while循环创建了这个方法,只要x<的值,它就会继续运行。 100.只有按下空格键,x才会增加1。我到底该怎么做?

我写的内容如下:

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

我知道,我知道。只需按一下空格键,我的代码就会不断增加x。那是因为key的值在整个循环中保持不变。需要做的是“刷新”键的值,并通过按空格键触发另一个键事件。我不知道如何做到这一点。任何建议都将不胜感激。

keyPressed在另一个类中定义为:

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

1 个答案:

答案 0 :(得分:1)

循环必须在与侦听KeyEvent的线程不同的线程中运行。 调用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);
    }
 }

}

请注意,线程之间共享的属性必须是线程安全的(对于String,您可以使用java.util.concurrent.atomic包中的AtomicReference类)

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