防止Java Swing JTable在输入无效数据时失去焦点

我们目前在java swing中有一个关于JTable / JTextEditor的焦点问题。 JTable有一个定制的单元格编辑器,它是一个JTextField

问题是当一个单元格被编辑并且包含无效数据,并且用户点击JButton ,文本字段将停止编辑,并调用JButton actionPerformed(点击)。 JTable#setValueAt处理验证,因此如果JTextField的数据无效,则不会更新基础TableModel

理想情况下,我们不想让JButton发生点击。 焦点应该保留在JTableJTextField

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

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

不幸的是,我们的代码并不简单。 UI是用XML构造的,这样按钮就不会知道表单上的其他东西(这是我继承的代码)。

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


在编辑完成后验证输入,在setValueAt()中可能不方便迟到。 编辑器本身可以排除无效值的导航,如本例中链接到相应的教程部分所示。

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

table.putClientProperty("terminateEditOnFocusLost", true);

我通过覆盖JTableCellEditorstopCellEditing方法来实现类似的功能。

@Override
public boolean stopCellEditing() {
   String s = (String) getCellEditorValue();       
   if (s != null) {           
       if (!testYourValue()) {           
           Toolkit.getDefaultToolkit().beep();           
           return false;
       }
   }
   return super.stopCellEditing();
} 

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

链接地址: http://www.djcxy.com/p/52439.html

上一篇: Prevent Java Swing JTable losing focus when invalid data entered

下一篇: FocusEvent doesn't get the last value of JFormattedTextField, How I can get it?