我有自定义表格模型以及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);
}
答案 0 :(得分: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));
}
}
所以你最有可能做错了,你没有告诉我们。发布堆栈跟踪和相关代码以获得更好的答案。
答案 1 :(得分:2)
我认为您应该使用包装类Double
代替double
,因为原始类型不能与null
一起分配,但包装类型可以。这就是其他具有不同类型的电池的原因,例如String
工作的String
也可以分配到null
。
答案 2 :(得分:2)
在自定义单元格渲染器中,您需要考虑实际的空值。您可以从表模型返回null
或预定义值(例如0)。
如果你的模型实际上是返回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);
}