Java-等待某种类型的按键继续
在Java中实现“按x继续”类型的东西的最佳方法是什么 具体来说,我有一个扩展JFrame的自定义类和一个扩展JPanel的自定义类。我有一个Main.java(它有我的JFrame类的一个实例),在用户按下空格键之前,我不想继续: Main.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
...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”上方添加打印语句,然后按空格,它将打印两次