在我的JavaSwing应用程序中,如何在管道的早期删除事件?

在我的JavaSwing应用程序中,如何在管道的早期删除事件?,java,swing,events,Java,Swing,Events,某些操作系统生成按键事件的速度快于我的应用程序处理它们的速度。我的第一个想法是,如果调用距离太近,就不要执行该操作,例如: public void actionPerformed(ActionEvent e) { long now = System.currentTimeMillis(); if(now - lastCall < 150) { System.out.println("dropping event"); } else {

某些操作系统生成按键事件的速度快于我的应用程序处理它们的速度。我的第一个想法是,如果调用距离太近,就不要执行该操作,例如:

public void actionPerformed(ActionEvent e) {
    long now = System.currentTimeMillis();
    if(now - lastCall < 150) {
        System.out.println("dropping event");
    }
    else {
        lastCall = now;
    }
}
public void actionPerformed(ActionEvent e) {
    e.consume();
    long now = System.currentTimeMillis();
    if(now - lastCall < 150) {
        System.out.println("dropping event");
    }
    else {
        lastCall = now;
    }
}
public void actionPerformed(ActionEvent e){
long now=System.currentTimeMillis();
如果(现在-上次呼叫<150){
System.out.println(“丢弃事件”);
}
否则{
lastCall=现在;
}
}
不幸的是,尽管事件被丢弃,应用程序仍然会锁定并在队列中累积大量事件。有没有一种方法可以在较低级别上删除事件?我认为当他们到达上面我的动作监听器时,要保存应用程序使其免于锁定已经太晚了。 谢谢你的帮助


编辑:我还应该提到,侦听器是与菜单项关联的抽象操作的一部分。

我不确定这是否真的有用,但也许您应该这样做:

public void actionPerformed(ActionEvent e) {
    long now = System.currentTimeMillis();
    if(now - lastCall < 150) {
        System.out.println("dropping event");
    }
    else {
        lastCall = now;
    }
}
public void actionPerformed(ActionEvent e) {
    e.consume();
    long now = System.currentTimeMillis();
    if(now - lastCall < 150) {
        System.out.println("dropping event");
    }
    else {
        lastCall = now;
    }
}
public void actionPerformed(ActionEvent e){
e、 消费();
long now=System.currentTimeMillis();
如果(现在-上次呼叫<150){
System.out.println(“丢弃事件”);
}
否则{
lastCall=现在;
}
}

如果你的应用程序无法及时响应按键,我会将耗时的部分带出频带,并在单独的线程中处理


然后,如果需要,您可以构建一个按键和箱子副本队列,或者对其执行其他智能过滤。这都是特定于应用程序的,但其核心似乎是GUI事件处理中有大量的处理。

应用程序无法处理按键事件有什么原因吗?您是否正在事件处理程序中执行长时间运行的操作?能够看到事件处理代码的样子也会很有帮助。请参阅下面我对Brian Agnew的评论。即使我将整个“操作”替换为单个打印行,该行为仍然会发生。事件似乎在队列中累积,需要一段时间才能到达处理程序。当他们到达那里时,锁定已经发生了,拥有快速动作代码,或者删除/合并事件似乎并不重要!你能在一个简单的例子中重现锁定行为吗?操作系统表现出这种行为的是什么?您需要描述您所做的可能导致大量事件发生的事情—只需按住键绑定即可!我的应用程序中的右箭头向前移动了一个进度条,所以用户很高兴地按住它。我喜欢这个想法,但consume()是受保护的!虽然我可以想象使用KeyListener而不是AbstractAction,因为consume()是KeyEvents的公共对象。不过,我想避免这种情况,因为动作与菜单项关联很好,但它是一种途径。再次感谢。谢谢你的反馈。在actionPerformed中运行的代码实际上一点都不密集。事实上,即使用一个打印行替换所有打印行,仍然会发生这种情况。即使我将代码中的聚合时间限制在1000毫秒以上,程序仍然会挂起。另一方面,如果你尽可能快地按按键(比如说每秒10次),它运行正常。事件花费的时间太长,无法到达操作侦听器,当它们到达那里时,管道已经“阻塞”,像上面的代码中那样丢弃事件没有任何帮助:-\