Inputverifier单元格编辑器

时间:2014-09-15 08:55:20

标签: java swing jtable tablecelleditor inputverifier

我的表中有一列货币金额。困难在于每行可以有不同的货币。我已经设置了一个默认的单元格编辑器,它在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。使用我的表格我不能使用格式化程序,因此一旦获得s​​topCellEditor,isEditValid就为真。我能看到这样做的唯一方法是在字段上使用InputVerifier。

问题是:在表格单元格上使用InputVerifiers是否可行?

我已经考虑过在格式化程序中覆盖stringToValue和valueToString,但是我无法访问行的货币细节,只能访问字符串。使用InputVerifier,我可以访问单元格的原始字段,该字段是JFormattedTextField的子类,并添加了货币信息。

我希望这是有道理的。

1 个答案:

答案 0 :(得分:1)

问题是在验证我的FormattedTextString时我使用的是getValue而不是getText。在输入新数据之前,将值设置为原始值。文本设置为新值。一旦改变它就按预期行事。

为了将来参考,在表格中的FormattedTextField上调用InputVerifier,直到进行单元格处理才会调用它,因此它不能用于表格单元格验证。