【问题标题】:save EventQueue events and restore保存 EventQueue 事件并恢复
【发布时间】:2012-11-09 10:03:54
【问题描述】:

是否可以从事件队列中保存待处理的事件然后恢复它们?

有以下工作流程:用户单击 JTable 行并检查行是否更改,这取决于打开的检查模式确认窗口。当用户双击行详细视图时打开。因此,当打开模式窗口时,它会吞下所有鼠标事件,因此双击不会到达 JTable。

我想在打开模式窗口之前以某种方式保存事件队列中的所有待处理事件,并在模式窗口关闭后恢复它们。

我试过了

EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
Stack<AWTEvent> events = new Stack<AWTEvent>();
PaintEvent pe = new PaintEvent(DetailPanel.this, PaintEvent.PAINT, new Rectangle(10, 10));
eventQueue.postEvent(pe);
while (eventQueue.peekEvent() != null) {
    AWTEvent event = eventQueue.getNextEvent();
    events.push(event);
}
..... // modal window code
while(!events.isEmpty()) {
    eventQueue.postEvent(events.pop());
}

这没有帮助,双击无法到达 JTable。

我还尝试推送整个队列:

EventQueue stackQueue = new EventQueue();
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
stackQueue.push(eventQueue);
... //modal window code
eventQueue.push(stackQueue);

在这种情况下,程序似乎陷入僵局。

欢迎提出任何建议。

【问题讨论】:

  • 为什么不只检查鼠标点击次数MouseEvent#getClickCount
  • @MadProgrammer,鼠标点击和行更改在不同的处理程序中处理。
  • @misha nesterenko 使用 Java7 并不好,有可能创建辅助循环 :-)

标签: java swing mouseevent eventqueue


【解决方案1】:

似乎我发现了问题。应该没有Stack,只是普通的FIFO收集。

所以遵循架构正确保存和恢复事件

EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
List<AWTEvent> events = new ArrayList<AWTEvent>();
eventQueue.postEvent(new PaintEvent(DetailPanel.this, PaintEvent.PAINT, new Rectangle(10, 10));
while (eventQueue.peekEvent() != null) {
    events.add(eventQueue.getNextEvent());
}
..... // modal window code
For (AWTEvent event : events) {
    eventQueue.postEvent(event);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多