0

次のようにカスタムテーブルモデルを実装しました。

public class MyTableModel extends AbstractTableModel {
    ...
    ...
    @Override
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    ...
    ...
}

上記のTableModelを持つJTableを表示すると、上記のメソッドによってNullPointerExceptionがスローされます。

例外は、データベーステーブルのいくつかの空のセルが原因だと思います。

例外がデータベーステーブルの空のセルが原因である場合、この問題を回避するにはどうすればよいですか?

データベース内のすべての列に何らかの値があることは必須ではありません。一部の列には何も含めることができません。

4

4 に答える 4

1

If cells can contain empty values, then calling getClass() on a null value will certainly give you the NPE. Sure you can check for null, but your real problem is more subtle than that.

TableModel インターフェイスは、getColumnClass(int)が「列内のすべてのセル値に対して最も具体的なスーパークラス」を返す必要があることを指定します。一見すると、1 つの列に対して任意の数のクラス型を返す可能性があり、実質的に TableModel 契約を破っています。

通常、列の型はテーブル データの特定のセットに対して静的です。つまり、基になるテーブル データが変更されない限り、列のクラスは変更されません。なぜそのような特定の値を返す必要があるのか​​ を尋ねることが重要だと思います。

特定のクラス タイプに固有のものをレンダリングする場合は、独自のTableCellRendererを作成し、セルごとに Object タイプを決定することをお勧めします。そこから、必要に応じて特定のレンダリングを行うことができます。

于 2010-02-04T19:38:44.257 に答える
1

1 つの問題は、これらの特定の座標に対して null を取得する理由です。それが正当であり、何も特別なものをレンダリングしたくない場合は、null チェックを行って Object.class を返す必要があります。

   public Class getColumnClass(int c) {
        Object o = getValueAt(0, c);
        if(o==null) return Object.class;
        return o.getClass()
    }

これにより、デフォルトのレンダラーが確実に使用され、値がないため何もレンダリングされません。

于 2010-02-04T19:29:55.660 に答える
0

多分:

public Class getColumnClass(int c) {
        return (getValueAt(0, c) == null ? Object.class : getValue(0, c).getClass());
  }

お役に立てば幸いです。

于 2010-02-04T19:29:22.603 に答える
0

これまでの回答に加えて、モデルがList(前の質問で示唆されているように)によってサポートされていると仮定すると、に行が含まれていない (つまりが空である)場合IndexOutOfBoundsExceptionにレンダリングしようとすると、 が表示されます。これは厄介なエッジ ケースです (あなたが をレンダリングしようとしていることに気付いたように-が空にならないことをどのように知っていますか?)。JTableTableModelListResultSetResultSet

これを避けるために、私が最初に提案したことをして、各列のクラスを から決定しなかったのはなぜResultSetMetaDataですか?

于 2010-02-04T20:47:17.280 に答える