Cod*_*Guy 6 java swing keylistener jpanel jframe
在Java中实现"按x继续"类型的东西的最佳方法是什么?
具体来说,我有一个自定义类,它扩展了JFrame和一个扩展JPanel的自定义类.我有一个Main.java(它有一个我的JFrame类的实例),有一点我不想继续,直到用户按下空格键:
Main.java:
...code...
frame.waitForSpace();
...more code which gets executed only after space is pressed...
Run Code Online (Sandbox Code Playgroud)
所以,在我的框架类中,我应该如何实现这个:
MyFrame.java:
/* This method only finishes when the space bar is pressed */
public void waitForSpace() {
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我在我的JFrame上有KeyListener,当按下空格按钮时它可以工作.但我不太确定如何将其融入到我想要做的事情中.
示例代码真棒!
调用await() 时使用CountDownLatch,当前main() 线程将等待,直到从另一个线程调用countDown() 方法。
KeyEventDispatcher允许您全局添加击键侦听器。因此,每当按下一个键时,dispatchKeyEvent() 都会从 EDT(事件调度线程)中调用,您可以在其中检查是否按下了“空格”并释放 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);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8286 次 |
最近记录: |