Java - 等待某种类型的按键继续

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,当按下空格按钮时它可以工作.但我不太确定如何将其融入到我想要做的事情中.

示例代码真棒!

Gar*_*all 1

调用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)