简体   繁体   English

保存EventQueue事件并还原

[英]save EventQueue events and restore

Is it possible to save pending events from event queue and then restore them? 是否可以从事件队列中保存未决事件,然后将其还原?

There is following workflow: user click on JTable row and there is a check if row is changed, depending on that check modal confirmation window is opened. 有以下工作流程:用户单击JTable行,并根据打开的检查模式确认窗口检查行是否更改。 When user double clicks row detail view is opened. 用户双击时,将打开行详细信息视图。 So when modal window is opened it swallows all mouse events and thus double click does not reach JTable. 因此,当打开模式窗口时,它将吞噬所有鼠标事件,因此双击不会到达JTable。

I wanted somehow save all pending events from event queue before opening modal window and restore them after modal window is closed. 我想以某种方式在打开模式窗口之前保存事件队列中的所有未决事件,并在模式窗口关闭后恢复它们。

Following I tried 以下我尝试

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

This does not help, double click does not reach JTable. 这无济于事,双击无法到达JTable。

Also I tried pushing whole queue: 我也尝试推动整个队列:

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

In this case programs seems to be deadlocked. 在这种情况下,程序似乎陷入僵局。

Any suggestions are appreciated. 任何建议表示赞赏。

Seems I found issue. 似乎我发现了问题。 There should not be Stack , just ordinary FIFO collection. 应该没有Stack ,只有普通的FIFO集合。

So following schema correctly saved and restored events 因此,遵循架构正确保存和还原的事件

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM