【问题标题】:How to store rounded values in a table instead of just displaying them as rounded如何将四舍五入的值存储在表格中,而不仅仅是将它们显示为四舍五入
【发布时间】:2014-07-26 12:57:15
【问题描述】:

我有一个表格,我需要将其中的数字四舍五入到小数点后 4 位。我已经设法做到了,但问题是当表格显示舍入值时,存储的实际值不是舍入值(我使用 BigDecimal 是因为我希望能够控制单元格的舍入行为)。当我打印单元格值时,即使表中显示的值是四舍五入的值,我也会得到超过 4 个十进制值的数字。我编写了自己的编辑器和渲染器如下:

class DoubleEditor4 extends DefaultCellEditor {

    public DoubleEditor4() {
        super(new JFormattedTextField());
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        JFormattedTextField editor = (JFormattedTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column);
        if (value!=null){
            String num = (String) value;
            BigDecimal num2 = new BigDecimal(num).setScale(4, BigDecimal.ROUND_HALF_UP);
            String text = num2.toString();
            editor.setHorizontalAlignment(SwingConstants.RIGHT);
            editor.setText(text);
        }
        return editor;
    }   
}

class DoubleRenderer4 extends DefaultTableCellRenderer {
    public DoubleRenderer4() { 
        super();
        this.setHorizontalAlignment(SwingConstants.RIGHT);
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        value = new BigDecimal(value.toString()).setScale(4, BigDecimal.ROUND_HALF_UP);
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column );
    }

    public void setValue(Object value) {
        BigDecimal num2 = new BigDecimal(value.toString()).setScale(4, BigDecimal.ROUND_HALF_UP);
        String text = num2.toString();
        setText(text);
    }
}

我做错了什么使得表模型中的存储值不是四舍五入的值?谢谢。

【问题讨论】:

    标签: java jtable tablecellrenderer tablecelleditor


    【解决方案1】:

    我设法通过重写单元格编辑器类中的 getCellEditorValue() 方法解决了这个问题:

    @Override
    public Object getCellEditorValue() {
        Object v = super.getCellEditorValue();
        BigDecimal n = new BigDecimal(v.toString()).setScale(4, BigDecimal.ROUND_HALF_UP);
        return n.toString();
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多