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

Java-等待某种类型的按键继续,java,swing,jframe,jpanel,keylistener,Java,Swing,Jframe,Jpanel,Keylistener,在Java中实现“按x继续”类型的东西的最佳方法是什么 具体来说,我有一个扩展JFrame的自定义类和一个扩展JPanel的自定义类。我有一个Main.java(它有我的JFrame类的一个实例),在用户按下空格键之前,我不想继续: Main.java: ...code... frame.waitForSpace(); ...more code which gets executed only after space is pressed... 那么,在我的框架类中,我应该如何实现这一点: M

在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,当按下空格键时,它就会工作。但我不太确定如何将其融入我的工作中


示例代码将非常棒

当用户将空格按入该处理程序时,放入您想做的任何操作。很可能你不想每次按下空格键都做(任何事情),但只是在某些时候;因此,事件处理程序应取决于某个变量的值,在您希望用户按空格键之前运行的代码应将该变量设置为表示“执行”的值。处理程序应在运行后将该变量设置回默认值。

不要使用KeyLIstener


使用键绑定。您已经获得了键绑定教程的链接。

记住Swing GUI是事件驱动的。所以不要等待任何事情。相反,为类提供某种类型的状态字段(可能是布尔值),在按键时更改状态变量,可能使用键绑定,然后不允许某些行为,除非状态已更改(通过if语句)。

使用倒计时闩锁调用wait()时,当前的main()线程将等待从另一个线程调用countDown()方法

KeyEventDispatcher允许您全局添加击键侦听器。因此,每当按下一个键时,就会从EDT(事件调度线程)调用dispatchKeyEvent(),在那里可以检查按下的“空格”并释放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);
}

你介意就此私奔吗?我以前从未做过这样的事。这段代码会去哪里?如果输入空格键,这段代码只注册一次吗?它似乎注册了不止一次。每次调用该方法时,将向侦听器添加一个新的KeyEventDispatcher,但在按下空格后,它将被删除。但如果我保留空格,将触发多个事件。如何使其基于键入的空格而不是按空格?具体来说,如果在“lock.countDown”上方添加打印语句,然后按空格,它将打印两次