我们目前在java swing中遇到JTable
/ JTextEditor
的焦点问题。 JTable
有一个自定义单元格编辑器,JTextField
。
问题是当正在编辑单元格并包含无效数据,并且用户单击JButton
时,文本字段将停止编辑并调用JButton
actionPerformed(clicked)。 JTable#setValueAt
会处理验证,因此如果JTextField
中的数据无效,则不会更新基础TableModel
。
理想情况下,我们不希望发生JButton
点击。焦点应保留在JTable
或JTextField
。
单击该按钮将执行提交操作并关闭表所在的框架。由于TableModel#setValueAt
中的验证未更新该值,因此它会提交旧值。
可以这样做吗?我仍然是Swing的新手,所以我不知道该检查什么。
不幸的是,我们的代码不是直截了当的。 UI是由XML构造的,使得按钮对表单上的任何其他内容一无所知(这是我继承的代码)。
在.net中,您可以通过处理Validating事件并设置取消标记来停止控件失去焦点。是否有类似Java的机制。
答案 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();
}