1

我有一个扩展 jframe 的类,其键绑定映射到一个不可见的按钮。当我按下键盘上的键时,它会执行按钮的命令。但是,如果用户按住按钮,它将每秒执行该命令一百次,从而使程序崩溃。我该如何防止这种情况,以便命令只执行......假设......按下键时每秒一次?

代码片段如下:

JButton fire = new JButton("");
KeyStroke spaceBar = KeyStroke.getKeyStroke("SPACE");
FireCommand fc = new FireCommand();
this.fire.setAction(fc);
imap.put(SpaceBar,"space");
amap.put("space",fc);
4

3 回答 3

1

添加一个变量来跟踪上次按下按钮的时间,并将 if 添加到您的事件处理程序中,如果没有足够的时间,则不执行任何操作。例如:

// define last event time somewhere in your GUI
int lastClickTime = 0;

// min delay in milliseconds
static final int minClickDelay = 100;

// ...

// Add a check to the event handler
void onEvent(eventArgs)
{
    int now = System.currentTimeMillis();

    // do nothing, if not enough time has passed
    if (now - lastClickTime < minClickDelay) return;

    // do the real thing here
    doHardWork();
}
于 2013-11-21T09:36:24.717 回答
1

看一下KeyStroke#getKeyStroke(int, int, boolean),它将允许您为按键释放而不是按键定义击键。例如:

KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true);
于 2013-11-21T09:41:42.053 回答
1

在 Windows 环境中,解决方案是有两个绑定。一个用于keyPressed启动计时器,该计时器以您希望的任何间隔持续触发,另一个用于keyReleased停止计时器。

有关完整示例,请参阅Motion Using the Keyboard的最后一个示例。

我不确定这种方法是否仍然适用于 Mac,因为我相信 Mac 上的事件顺序是按下、释放、按下、释放......当您按住键时。因此计时器的启动/停止可能无法按预期工作。

于 2013-11-21T16:23:03.460 回答