焦点丢失后推迟事件队列

时间:2012-02-14 11:16:49

标签: java swing focus joptionpane event-dispatch-thread

我有JTable个自定义单元格编辑器。编辑器实现了FocusListener,因此如果用户点击单元格,我可以检查单元格的内容是否有效。

我想在JOptionPanefocusLost)中使用EventDispatchThread,以允许用户选择是还原为旧值还是接受调整后的值。< / p>

这是问题;如果用户正在编辑某个单元格,然后点击该表格旁边的按钮,那么在 actionlisteners返回之前,该按钮的JOptionPane会被警告

这就是我想要发生的事情:

  • 用户编辑单元格
  • 用户点击按钮
  • Cell检测到焦点丢失
  • 显示JOptionPane,用户选择操作
  • JOptionPane关闭,单元格的值设置
  • Button的actionListeners名为

相反,这种情况正在发生:

  • 用户编辑单元格
  • 用户点击按钮
  • Cell检测到焦点丢失
  • 显示JOptionPane,用户选择操作
  • Button的actionListeners名为
  • JOptionPane关闭,单元格的值设置

JOptionPane关闭之前,是否可以推迟按钮的动作事件?

从其他线程,我已经读过JDialog做了一些魔术来确保事件调度继续,所以Dialog本身可以处理事件。

2 个答案:

答案 0 :(得分:0)

根据我收集的内容,您根本不想激活按钮的动作侦听器,直到用户从JOptionPane中选择正确的值为止。

对我来说,似乎解决方案是设置一个'禁用'标志,一旦触发了focusLost,它就会上升。选择完成后,禁用标志将关闭。触发按钮操作时,它会检查表单是否已禁用;如果是的话,它什么都不做。如果不是,它会继续正常。

请注意,一旦用户在JOptionPane中选择了某些内容,按钮事件就不会自动进入,而是必须再次单击该按钮。对我来说,这似乎是更好的功能,然后在他需要更改表格后再次为他点击“按钮”。

答案 1 :(得分:0)

将验证逻辑放在TableCellEditor#stopCellEditing()内,显示对话框,如果值无效,则返回false。

要在焦点丢失时自动停止表编辑,请使用table.putClientProperty("terminateEditOnFocusLost", true);,但我认为这不会停止按钮动作侦听器的运行。相反,我通常在actionPerformed中停止表编辑,并在返回false时不执行任何操作(或在适当时取消编辑,例如,如果操作是删除该表行)。