说我的Jtable中有以下列:
{"Item", "Price"}
我希望将price列格式化为“0.00”格式。 但是如果用户输入非法字符串,则保留单元格的原始值。 例如,当价格为“1.23”时,但当用户想要输入“abc”时,那么单元格仍应为“1.23”
我怎么能这样做?
由于
答案 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
}
}