0

カスタムテーブルモデルと、問題のあるjtableの二重列のカスタムレンダリングがあります。二重列に空白セルを残すオプションが必要です。実際、空白のままにすると、書き込みはnullになります。このオプションはデフォルトで別の文字列列にありますが、ここで空白にすると例外がスローされます。どうすればそれを作ることができますか?

編集:これはエラーです

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

3 に答える 3

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

したがって、あなたは私たちに言っていない何か間違ったことをしている可能性が最も高い. より良い回答のために、スタック トレースと関連コードを投稿してください。

于 2012-11-07T23:03:04.567 に答える
2

プリミティブ型は割り当てることができませんが、ラッパー型は割り当てることができるためDouble、代わりにラッパークラスを使用する必要があると思います。これが理由です。たとえば、に割り当てることができるように、異なるタイプの他のセルが機能しています。doublenullStringStringnull

于 2012-11-07T22:08:10.950 に答える
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);
}
于 2012-11-07T22:24:44.580 に答える