【发布时间】:2014-11-08 18:03:27
【问题描述】:
我有一个表格,其中有一列中的货币金额。困难在于每一行可以有不同的货币。我已经设置了一个默认的单元格编辑器,它在 stopCellEditing 中进行验证,效果很好。如果数据无效,编辑器不会停止,但会将值恢复为其原始值,而不是将无效数据留在单元格中。我已经设置了 Focus Lost 行为:
ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);
我查看了单元格编辑器的示例(请参阅Specifying Formatters and Using Formatter Factories),它之所以有效,是因为它使用整数格式:
//Set up the editor for the integer cells.
integerFormat = NumberFormat.getIntegerInstance();
NumberFormatter intFormatter = new NumberFormatter(integerFormat);
intFormatter.setFormat(integerFormat);
intFormatter.setMinimum(minimum);
intFormatter.setMaximum(maximum);
ftf.setFormatterFactory(
new DefaultFormatterFactory(intFormatter));
ftf.setValue(minimum);
ftf.setHorizontalAlignment(JTextField.TRAILING);
ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);
此格式工厂在 JFormattedTextField 中设置 isEditValid=false,因此当调用 stopCellEditing 时,它已经将 isEditValid 设置为 false。对于我的表,我不能使用格式化程序,因此一旦它到达 stopCellEditor,isEditValid 就为真。我能看到的唯一方法是在字段上使用 InputVerifier。
问题是:在表格单元格上使用 InputVerifiers 是否可行?
我希望在 Formatter 中覆盖 stringToValue 和 valueToString,但我无法访问该行货币的详细信息,只能访问字符串。使用 InputVerifier,我可以访问单元格的原始字段,该单元格是 JFormattedTextField 的子类,并添加了货币信息。
我希望这是有道理的。
【问题讨论】:
-
试一试,输入验证器在超级(StopCellEditing())的 stopCellEditing 之后被调用。我需要在此之前验证该字段。
-
可能duplicate.
-
不完全,这个有点深。表格单元格被定义为一个字符串,因此在用户键入时没有真正的错误检查。当焦点丢失并且调用 stopCellEditor 方法时,标志 isEditValid 设置为 true。我在此方法中进行所需的验证,并在出现错误时返回 false。然后该单元格被还原而不是像我要求的那样持久化。我要问的是有没有办法拦截单元格的编辑,以便我可以将 isEditValid 设置为 false?我可以编写一个自定义格式化程序,但每按下一个键都会调用它。有什么建议吗?
标签: java swing jtable tablecelleditor inputverifier