Java:Keybind冷却时间?

时间:2013-11-21 09:31:34

标签: java swing key-bindings key-events

我有一个扩展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);

3 个答案:

答案 0 :(得分:1)

添加一个跟踪上次按下按钮的变量,并在事件处理程序中添加if,如果时间不够,则不执行任何操作。 E.g:

// 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();
}

答案 1 :(得分:1)

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

KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true);

答案 2 :(得分:1)

Windows环境下的解决方案是拥有两个绑定。一个用于keyPressed,它启动一个定时器,在你想要的任何时间间隔内连续发射,另一个用于停止定时器的keyReleased

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

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