1

私は自分の解決策を見つけたときに誰かが私に何かを説明してくれることを望んでいましたが、なぜそれが機能するのかわかりません。クラスタイプごとのデフォルトのレンダラーをテーブル全体に設定したかったのですが、作成時にオブジェクトがテーブル内のどこにあるかはわかりませんでした。

Calendar私はJTableを宣言し、クラスのデフォルトのレンダラーを自分のものに設定して、任意Calendarのsがそれ自体だけでなく意味のある表現を提供するようtoString()にしました。

JTable table = new JTable();
table.setDefaultRenderer(Calendar.class, new MyRenderer());

public class MyRenderer extends DefaultTableCellRenderer{
    public MyRenderer() { super(); }
    @Override
    public void setValue(Object value){
            setText(makeCalendarToDate((GregorianCalendar)value));
    }
}

これは、ここでgetColumnClass行ったようにメソッドを上書きするまで機能しません。

sunのドキュメンテーションによるとgetColumnClass、上記の例でオーバーライドされたものを正確に実行する必要があるようです-そのメソッドをオーバーライドすると機能するのに、ストック実装を離れるときに機能しないのはなぜですか?

これで、列を0行目まで埋めるまで、列を埋めることができますCalendar。これは私が望んでいたことですが、そもそも何が原因でそれができなかったのでしょうか。

4

1 に答える 1

2

JTableは、モデルから列クラスを取得します。答えは、AbstractTableModelの実装にあります。これは、テーブルモデルのベースになっているものであると想定しています。AbstractTableModelでは、getColumnClassは次のように実装されています。return Object.class;したがって、オーバーライドしない限り、列オブジェクトは常にObjectとして処理されます。これは、モデルが自動的に処理するものではありません。getColumnClassをオーバーライドするだけで、それを回避する方法はありません。

于 2010-07-16T19:48:46.940 に答える