格式化Jtable Cell,如果是非法格式,则不执行任何操作

时间:2011-01-28 15:22:25

标签: java swing jtable

说我的Jtable中有以下列:

{"Item", "Price"}

我希望将price列格式化为“0.00”格式。 但是如果用户输入非法字符串,则保留单元格的原始值。 例如,当价格为“1.23”时,但当用户想要输入“abc”时,那么单元格仍应为“1.23”

我怎么能这样做?

由于

4 个答案:

答案 0 :(得分:2)

让我们把你的大问题分成更小的问题。

首先,您希望根据指定的格式显示Price列的项目,您可以使用TableCellRenderer(在呈现数字时使用NumberFormat来实现这些项目。 3}}显示正确的小数位数)。由于您的表只有两列不同类型,最简单的解决方案是使用JTable#setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)。这样,您的数字将始终使用正确的小数位数显示。

其次,对于您的版本问题,相同的解决方案可能相当优雅:调用JTable#setDefaultEditor(java.lang.Class, javax.swing.table.TableCellEditor)并将编辑器设置为在提交更改为表模型之前将确保新值为有效号码(当然根据您的规则有效)。

答案 1 :(得分:2)

JTable默认支持此功能。该表将根据存储在每列中的数据选择渲染器/编辑器。所以你需要做的就是覆盖getColumnClass(...)方法来返回Double.class。然后,当您编辑单元格时,编辑器将确保输入的值是有效数字。

如果您想要更好地控制数字的格式,那么您可以使用Table Format Renderer

答案 2 :(得分:1)

JFormattedTextField按照您描述的方式工作,因此只需创建一个扩展CellEditor的新JFormattedTextField

答案 3 :(得分:0)

将格式化命令放入try / catch块。如果操作失败并显示NumberFormatException,请取消编辑。

使用原始代码,进行一些小改动:

public void setValue(Object value) {
   NumberFormat formatter = new DecimalFormat("0.00");
   String s = null;
   try {
      s = formatter.format(Integer.parseInt((String)value));
      if (null != s) setText(s);
   } catch (NumberFormatException ex) {
      // what could I do here?
      // You could display a warning JOptionPane and/or output to System.out
   }
}