2

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

我想使用JOptionPaneinside focusLost(in the EventDispatchThread)来允许用户选择是恢复到旧值还是接受调整后的值。

这就是问题所在;如果用户正在编辑一个单元格,然后单击远离表格的按钮,则该按钮在返回之前actionlisteners会收到警报。 JOptionPane

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

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

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

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

是否可以将按钮的操作事件推迟到JOptionPane关闭之后?

从其他线程中,我读到它JDialog确实可以确保事件调度继续进行,因此 Dialog 本身可以处理事件。

4

2 回答 2

0

将您的验证逻辑放入TableCellEditor#stopCellEditing()其中,显示您的对话框并在值无效时返回 false。

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

于 2012-02-14T11:42:21.650 回答
0

据我所知,您根本不希望按钮的动作侦听器激活,直到用户从 JOptionPane 中选择正确的值之后。

在我看来,解决方案似乎是设置一个“禁用”标志,一旦触发 focusLost 就会上升。一旦做出选择,禁用标志就会下降。当按钮动作被触发时,它会检查表单是否被禁用;如果是,它什么也不做。如果不是,它会照常继续。

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

于 2012-02-14T11:30:40.880 回答