问题并不像我将要描述的那么简单,但范式有点类似。所以,假设我使用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);
}
}
答案 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