2012-11-08 81 views
3

我必須在JTable中創建一個列,它是雙精度類型以獲取數字並精確地舍入所有數字。不僅要以精度顯示它們,而且要將數字寫入精確的數據2.事實上,如果我寫入2.456,它應該在單元格和數據中寫入2.46。如何做到這一點的最佳方式?使用自定義單元格渲染器還是自定義單元格編輯器? 我有這樣的代碼,但它不要改變數據只顯示了單元Jtable與雙單元格類型精度

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); 
} 


} 
+0

JTable有兩種狀態,渲染器和編輯器,渲染器即將在XxxTableModel格式化值店,不出意外,編輯器約增加,motify,刪除值存儲在XxxModel,在CellEditor不存在的時候,然後添加,修改,刪除值存儲在XxxTableModel – mKorbel

回答

3

你應該同時使用正確的數據。

的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)

+0

中,但我想用不同的方式顯示數據的編輯方式。所以不僅僅使用編輯器更好? – user1761818

+0

@ user1761818編輯器只是您編輯數據的方式。一次只能編輯一個單元格,所有其他單元格都可以使用TableCellRender進行「渲染」。 –

+0

但我一次只能填充一個單元格,所以它很好。我只是想當我輸入雙精度數字更多的2精度它被保存爲像精度兩個數字。該怎麼辦?編輯器或渲染以及要覆蓋的方法 – user1761818

3

如果我明白你的問題正確,要與精度有限的雙打存儲在模型中,用戶填寫即使在數字更多的值中。

在這種情況下,您只需要一個自定義編輯器在將值存儲在模型中之前對值進行四捨五入。覆蓋/調整getCellEditorValue()方法以對輸入值執行必要的舍入操作

0

我同意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); 
    } 
}