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

时间:2012-05-23 11:14:03

标签: java swing focus jtable tablecelleditor

我们目前在java swing中遇到JTable / JTextEditor的焦点问题。 JTable有一个自定义单元格编辑器,JTextField

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

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

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

可以这样做吗?我仍然是Swing的新手,所以我不知道该检查什么。

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

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

4 个答案:

答案 0 :(得分:3)

setValueAt()编辑结束后验证输入可能不方便。编辑器本身可以排除无效值的导航,如此example中所示,该tutorial section链接到相应的{{3}}。

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

table.putClientProperty("terminateEditOnFocusLost", true);

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我通过覆盖stopCellEditing JTable中的CellEditor方法来实现类似的功能。

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