我有一个扩展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);
答案 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的启动/停止可能无法按预期工作。