【发布时间】:2012-03-05 18:19:19
【问题描述】:
我有一个带有自定义单元格编辑器的JTable。编辑器实现了FocusListener,因此如果用户点击离开单元格,我可以检查单元格的内容是否有效。
我想在focusLost(在EventDispatchThread)中使用JOptionPane,以允许用户选择是恢复为旧值还是接受调整后的值。
这就是问题所在;如果用户正在编辑单元格,然后单击远离表格的按钮,按钮的actionlisteners 会在JOptionPane 返回之前收到警报。
这就是我想要发生的事情:
- 用户编辑单元格
- 用户点击按钮
- 单元格检测到焦点丢失
- 显示 JOptionPane 并且用户选择操作
- JOptionPane 关闭并设置单元格的值
- Button 的 actionListener 被调用
相反,这正在发生:
- 用户编辑单元格
- 用户点击按钮
- 单元格检测到焦点丢失
- 显示 JOptionPane 并且用户选择操作
- Button 的 actionListener 被调用
- JOptionPane 关闭并设置单元格的值
是否可以将按钮的操作事件推迟到JOptionPane 关闭之后?
从其他线程中,我了解到JDialog 做了一些魔术来确保事件调度继续进行,因此 Dialog 本身可以处理事件。
【问题讨论】:
-
是的,JDialog 有一些魔力,因为当您从 AWT 事件队列中显示 JDialog 时,您实际上是在阻止新事件被分派,因为对 JDialog 上的 setVisible(true) 的调用是阻塞的。为了避免这种情况,JDialog 访问事件队列并自动调度新的传入事件。如果你想在当前处理的事件之后推迟一个事件,你可以使用
SwingUtilities.invokeLater(Runnable)。Runnable在当前事件结束后执行。 -
无论你做什么,都不要使用 focusListener - 特别是在表格(或树或组合)编辑的上下文中,它的级别太低且极难正确(记住:焦点处理是高度依赖操作系统,什么时候发生的顺序是不可预测的,加上表本身会干扰内部魔法)去做别的事情......
标签: java swing focus joptionpane event-dispatch-thread