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
问题并不像我描述的那么简单,但范例有点相似。所以,假设我用一个 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