Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止Java Swing JTable在输入无效数据时失去焦点_Java_Swing_Focus_Jtable_Tablecelleditor - Fatal编程技术网

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

防止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或

目前,java swing中的
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
方法中的内容无关紧要,单元格编辑器将关闭,单元格值将恢复到原来的状态。