2012-11-07 60 views
0

我有自定義表模型,並且還爲jtable中有問題的雙列自定義渲染。我想要在雙列中留下空白單元格的選項。事實上,當我將它留空時,寫入爲空。這個選項在另一個字符串列中是默認的,但是在這裏如果我把它留空,就會拋出一些異常。我如何做到這一點?在jtable中輸入雙精度單元格中的空白值

編輯:這是錯誤

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at table.MyTableModel.setValueAt(MyTableModel.java:62) 
    at javax.swing.JTable.setValueAt(JTable.java:2710) 
    at javax.swing.JTable.editingStopped(JTable.java:4712) 

這裏是MyTaleModel

public void setValueAt(Object value, int row, int col) { 

    data.get(row)[col] = value; 
    fireTableCellUpdated(row, col); 
} 

這是數據的代碼:static ArrayList<Object[]> data

,這是列渲染

public class ColumnRenderer extends DefaultTableCellRenderer { 

int precision = 0; 
Number numberValue; 
NumberFormat nf; 

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

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

「有些」異常?發生在特定位置的特定異常被拋出。它包含一個特定的消息,旨在被讀取。如果您不瞭解堆棧跟蹤,至少要顯示它,並附上相應的代碼。 –

+0

由'setValue'引起的'NullPointerException'應該與您的單元格渲染器無關,它與您使用XxxTableModel時的數據/模型/編輯器 – MadProgrammer

+0

有關,與渲染器無關, – mKorbel

回答

2

我認爲你應該使用包裝類Double代替double,原始類型不能用null分配,但包裝類型可以。這是原因,其他具有不同類型的單元例如String正在按String工作,也可以分配到null

+0

否 - 出什麼問題實際使用表單元格渲染器 – MadProgrammer

2

在您定製的單元格渲染器中,您需要考慮實際是一個空值。您可以從表模型或預定義值(例如0)返回null

如果模型實際上是返回Double則變得容易得多......

在你自定義單元格渲染,你將需要爲「空」狀態的檢查......

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    if (value == null) { 
     value = ""; 
    } else { 
     // Carry on as normal... 
    } 
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
} 
3

不是一個真正的答案,但太長的評論。

如果您只想顯示Double實例,則不需要自定義渲染器。默認的渲染器能夠處理這種情況。唯一的先決條件是您在TableModel中爲getColumnClass方法返回正確的課程。

您可以在源代碼中看到默認渲染器已足夠。一個快速複製粘貼:

static class DoubleRenderer extends NumberRenderer { 
    NumberFormat formatter; 
    public DoubleRenderer() { super(); } 

    public void setValue(Object value) { 
     if (formatter == null) { 
      formatter = NumberFormat.getInstance(); 
     } 
     setText((value == null) ? "" : formatter.format(value)); 
    } 
} 

所以你很可能做錯你不告訴我們。發佈堆棧跟蹤和相關代碼以獲得更好的答案。

+0

請參閱OP的上一個問題 – mKorbel