我的表中有一列货币金额。困难在于每行可以有不同的货币。我已经设置了一个默认的单元格编辑器,它在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是否可行?
我已经考虑过在格式化程序中覆盖stringToValue和valueToString,但是我无法访问行的货币细节,只能访问字符串。使用InputVerifier,我可以访问单元格的原始字段,该字段是JFormattedTextField的子类,并添加了货币信息。
我希望这是有道理的。
答案 0 :(得分:1)
问题是在验证我的FormattedTextString时我使用的是getValue而不是getText。在输入新数据之前,将值设置为原始值。文本设置为新值。一旦改变它就按预期行事。
为了将来参考,在表格中的FormattedTextField上调用InputVerifier,直到进行单元格处理才会调用它,因此它不能用于表格单元格验证。