在Java中实现“按x继续”类型的东西的最佳方法是什么?
具体来说,我有一个扩展JFrame的自定义类和一个扩展JPanel的自定义类。我有一个Main.java(它有一个我的JFrame类的实例),有一点我不想继续,直到用户按下空格键:
Main.java:
...code...
frame.waitForSpace();
...more code which gets executed only after space is pressed...
所以,在我的框架类中,我应该如何实现它:
MyFrame.java:
/* This method only finishes when the space bar is pressed */
public void waitForSpace() {
}
顺便说一下,我的JFrame上有KeyListener,当按下空格键时它会起作用。但我不太确定如何将其纳入我想要做的事情中。
示例代码真棒!
答案 0 :(得分:2)
当用户将空格压入该处理程序时,放置您想要执行的操作。每次按下空格键时,你很可能不想(无论如何),但只有部分时间;因此,事件处理程序应该取决于某个变量的值,而在之前运行的代码,您希望用户按空格应该将该变量设置为意味着“执行它”的值。处理程序应该在运行后将变量设置回默认值。
答案 1 :(得分:2)
请记住,Swing GUI是事件驱动的。所以不要等待任何事情。而是给你的类一个某种类型的状态字段,也许是一个布尔值,在按键时更改状态变量,可能使用键绑定,然后不允许某些行为,除非状态已被更改(通过if语句)。
答案 2 :(得分:1)
不要使用KeyLIstener。
使用键绑定。您已经获得了键绑定教程的链接。
答案 3 :(得分:1)
在调用await()时使用 CountDownLatch ,当前的main()线程将一直等到从另一个线程调用countDown()方法。
KeyEventDispatcher 可让您全局添加击键侦听器。因此,每当按下一个键时,就会从EDT(事件调度线程)调用dispatchKeyEvent()并在那里检查' space'被按下并释放main()正在等待的倒计时锁存器。
但是,如果调用waitForSpace()的线程是EDT,那么你将强制EDT等待自己,导致死锁。据我所知,不可能在EDT上等待并仍然收到关键事件。
只要JFrame具有焦点,这将起作用:
public void waitForSpace() {
final CountDownLatch latch = new CountDownLatch(1);
KeyEventDispatcher dispatcher = new KeyEventDispatcher() {
// Anonymous class invoked from EDT
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE)
latch.countDown();
return false;
}
};
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher);
latch.await(); // current thread waits here until countDown() is called
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher);
}