【问题标题】:Jtable with double cell type precision具有双单元类型精度的 Jtable
【发布时间】:2012-10-29 05:14:00
【问题描述】:

我必须在 JTable 中创建我的一列,它是 double 类型,以仅获取数字并以精度 2 舍入所有列。不仅以这种精度显示它们,而且以精度 2 将数字写入数据。在事实上,如果我写 2.456 它应该在单元格和数据中写 2.46。最好的方法是如何做到这一点?使用自定义单元格渲染器还是使用自定义单元格编辑器? 我有这段代码,但它不会更改数据,它只会在单元格上显示正确的数据

public class DoubleCellRenderer extends DefaultTableCellRenderer {

int precision = 0;
Number numberValue;
NumberFormat nf;

public DoubleCellRenderer(int aPrecision) {
    super();
    precision = aPrecision;
    setHorizontalAlignment(SwingConstants.RIGHT);
    nf = NumberFormat.getNumberInstance();
    nf.setMinimumFractionDigits(aPrecision);
    nf.setMaximumFractionDigits(aPrecision);
}

@Override
public void setValue(Object value) {
    if ((value != null) && (value instanceof Number)) {
        numberValue = (Number) value;
        value = nf.format(numberValue.doubleValue());
    }
    super.setValue(value);
}


}

【问题讨论】:

  • JTable 有两种状态,渲染器和编辑器,渲染器是关于在 XxxTableModel 中格式化值存储,仅此而已,编辑器是关于在 XxxModel 中添加、主题、删除值存储,而 CellEditor 没有存在,然后add,motity,remove值存储在XxxTableModel中

标签: java swing jtable tablecellrenderer tablecelleditor


【解决方案1】:

你应该同时使用。

CellRenderer:数据如何显示(你要显示什么)

CellEditor:如何编辑数据(最终您可以选择在模型中设置什么值)

在这两种情况下,您都可以选择精度。在此处查看更多信息:http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender

注意:我建议宁愿覆盖 getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 而不是 setValue(Object value)

【讨论】:

  • 但我想以不同的编辑方式显示数据。那么只使用编辑器不是更好吗?
  • @user1761818 编辑器只是您编辑数据的方式。一次只能编辑一个单元格,因此所有其他单元格都使用 TableCellRender“渲染”。
  • 但我一次只能填写一个单元格,所以很好。我只希望当我输入具有更多 2 精度的双精度数时,它可以像精度为 2 的数字一样保存。该怎么办?编辑器或渲染以及要覆盖的方法
  • @user1761818 你混合了两个不同的概念。这两个类用于不同的目的。这不是一个选择的问题(我选择一个还是另一个?)。一个负责如何显示数据(例如您的数据是2.123456 而您只想显示2.12),另一个负责如何编辑数据(例如用户键入2.569874 和你只会存储2.57)
【解决方案2】:

如果我正确理解了您的问题,您希望在模型中以有限的精度存储双精度数,即使用户填写了更多数字的值。

在这种情况下,您只需要一个自定义编辑器来对值进行四舍五入,然后再将其存储到您的模型中。覆盖/调整 getCellEditorValue() 方法以对输入值执行必要的舍入

【讨论】:

    【解决方案3】:

    我同意 Guillaume 两者都使用。这是使用另一个答案中提到的 getTableCellRendererComponent 覆盖的渲染器的良好实现的链接。

    http://helpdesk.objects.com.au/java/how-to-control-decimal-places-displayed-in-jtable-column

    我稍微修改了一下,只在四舍五入时强制使用 3 位数字。还添加了检查以确保数据类型为双精度

    public static class DecimalFormatRenderer extends DefaultTableCellRenderer {
        private static final long serialVersionUID = 1L;
        private static final DecimalFormat formatter = new DecimalFormat( "#.###" );
    
        public DecimalFormatRenderer(){
            super();
            formatter.setMinimumFractionDigits(3);
        }
    
        public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                        // First format the cell value as required
    
            if(value instanceof Double){
                value = formatter.format((Number)value);
            }
    
            return super.getTableCellRendererComponent(
                table, value, isSelected, hasFocus, row, column );
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2013-06-02
      • 2021-06-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多