Java-クラスごとにJTableレンダラーを変更する
-
16-09-2020 - |
質問
私は自分の解決策を見つけたときに誰かが私に何かを説明できることを望んでいましたが、なぜそれが機能するのか理解できません。作成時にオブジェクトがどこにあるのかわからず、クラスタイプごとにデフォルトレンダラーをテーブル全体に設定したかったのです。
私はjtableを宣言し、デフォルトレンダラーを自分のものに設定しました Calendar
クラスは、任意のように 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
行われたように ここに
サンによると ドキュメント, 、それはのように見えます getColumnClass
私が上で与えた例でオーバーライドされたものを正確に行う必要があります-そのメソッドをオーバーライドしたときに機能するのはなぜですか?
今、私は列を埋めることができます Calendar
s保留中彼らは0行目を埋める、それは私が望んでいたものですが、そもそも私がそれをするのを妨げたのは何ですか?
解決
JTableは、モデルから列クラスを取得します。答えはAbstractTableModelの実装にあり、それがあなたのテーブルモデルに基づいているものであると仮定しています。AbstractTableModelでは、getColumnClassは次のように実装されています: return Object.class;
したがって、オーバーライドしない限り、列オブジェクトは常にオブジェクトとして処理されます。これは、モデルが自動的に処理するものではありません。GetColumnClassをオーバーライドするだけで、それを回避する方法はありません。