防止Java Swing JTable在输入无效数据时失去焦点
目前,java swing中的防止Java Swing JTable在输入无效数据时失去焦点,java,swing,focus,jtable,tablecelleditor,Java,Swing,Focus,Jtable,Tablecelleditor,目前,java swing中的JTable/JTextEditor存在一个焦点问题。JTable有一个自定义单元格编辑器,它是一个JTextField 问题是当单元格正在编辑且包含无效数据时,用户单击JButton,文本字段将停止编辑,并调用JButtonactionPerformed(clicked)。JTable#setValueAt处理验证,因此如果JTextField中的数据无效,则基础的TableModel不会更新 理想情况下,我们不希望出现JButton单击。重点应放在JTable或
JTable
/JTextEditor
存在一个焦点问题。JTable
有一个自定义单元格编辑器,它是一个JTextField
问题是当单元格正在编辑且包含无效数据时,用户单击JButton
,文本字段将停止编辑,并调用JButton
actionPerformed(clicked)。JTable#setValueAt
处理验证,因此如果JTextField
中的数据无效,则基础的TableModel
不会更新
理想情况下,我们不希望出现JButton
单击。重点应放在JTable
或JTextField
上
单击按钮将执行提交操作并关闭表格所在的框架。由于表格模型#setValueAt
中的验证不会更新值,因此会提交旧值
这能做到吗?我对Swing还比较陌生,所以我不知道该检查什么
不幸的是,我们的代码不是直截了当的。UI是用XML构建的,这样按钮就不知道表单上的任何其他内容(这是我继承的代码)
在.net中,您可以通过处理验证事件和设置取消标志来阻止控件失去焦点。Java是否有类似的机制。能否尝试在编辑器组件(即文本字段)上使用inputverifier?当组件失去焦点时,将调用失去焦点方法(中的更多参考)。因此,当失去焦点时,可以调用验证方法
如果您不需要知道正在编辑的特定字段,也可以在按钮内执行验证,如果不成功,则可以阻止提交。在编辑结束后在
setValueAt()
中验证输入可能会很晚。编辑器本身可以阻止对无效值的导航,如链接到相应
对于有效值,可以在失去焦点时使表提交:
table.putClientProperty("terminateEditOnFocusLost", true);
通过覆盖我的
JTable
的CellEditor
中的stopCellEditing
方法,我实现了类似的功能
@Override
public boolean stopCellEditing() {
String s = (String) getCellEditorValue();
if (s != null) {
if (!testYourValue()) {
Toolkit.getDefaultToolkit().beep();
return false;
}
}
return super.stopCellEditing();
}
为了更快地获得更好的帮助,请编辑您的问题,您是否可以告诉我们按钮的用途?为什么用户会点击它,为什么它首先在那里?你不能简单地在他们打字时禁用按钮吗?帮助我们理解具体的用例,我们可以更准确地帮助您。干杯。稍微编辑问题以帮助尝试绘制图片。我更习惯.NET,由于我们系统的复杂性,我无法真正发布代码片段。不过,我将尝试编写一个简单的场景,其中包含一个表和一个按钮。并且是特定于组件的。您知道有什么好的资源可以列出每个组件的这些属性吗?感谢检查
JTable
源代码,靠近celleditor或remover
。覆盖stopcelledition
无效。当表格失去焦点时,stopCellEditing
方法中的内容无关紧要,单元格编辑器将关闭,单元格值将恢复到原来的状态。