1

我们目前在 java swing 中JTable有一个焦点问题。JTextEditorJTable一个自定义单元格编辑器,它是一个JTextField.

问题是当正在编辑单元格并包含无效数据时,用户单击 aJButton时,文本字段将停止编辑并JButton调用 actionPerformed(单击)。JTable#setValueAt处理验证,因此如果 中的数据无效,则不会更新JTextField底层。TableModel

理想情况下,我们不想让JButton点击发生。焦点应保持在JTable或 上JTextField

单击按钮将执行提交操作并关闭表格所在的框架。由于验证TableModel#setValueAt不会更新值,它会提交旧值。

这可以做到吗?我对 Swing 还很陌生,所以我不知道要检查什么。

不幸的是,我们的代码不是直截了当的。UI 是从 XML 构造的,使得按钮对表单上的任何其他内容一无所知(这是我继承的代码)。

在 .net 中,您可以通过处理 Validating 事件并设置取消标志来阻止控件失去焦点。Java是否有类似的机制。

4

4 回答 4

3

在编辑结束后验证输入setValueAt()可能会很晚。编辑器本身可以排除无效值的导航,如链接到相应教程部分的此示例所示。

对于有效值,您可以在失去焦点时提交表:

table.putClientProperty("terminateEditOnFocusLost", true);
于 2012-05-23T17:59:45.990 回答
0

您可以尝试在编辑器组件(即文本字段)上使用 inputverifier 吗?

于 2012-05-23T12:10:59.673 回答
0

当焦点从组件中丢失时,将调用 lost focus 方法(更多参考http://docs.oracle.com/javase/tutorial/uiswing/events/focuslistener.html)。因此,您可以在失去焦点时调用验证方法。

如果您不需要知道正在编辑的特定字段,您还可以在按钮内执行验证,如果不成功则阻止提交。

于 2012-05-23T12:14:03.603 回答
0

我通过覆盖stopCellEditingJTableCellEditor.

@Override
public boolean stopCellEditing() {
   String s = (String) getCellEditorValue();       
   if (s != null) {           
       if (!testYourValue()) {           
           Toolkit.getDefaultToolkit().beep();           
           return false;
       }
   }
   return super.stopCellEditing();
} 
于 2014-09-23T05:36:33.157 回答