一般に、基本的な Swing クラスのメソッドをオーバーライドすることはお勧めできません。推奨される方法は、Jcomponent
を実装する を作成し、 を使用TableCellRenderer
してテーブルに適用することsetDefaultRenderer()
です。デフォルトでは、JTable は Object、Number、および Boolean 型に対してこれらのうちの 3 つを提供することに注意してください。通常、レンダラーは次のようになります。
public class MyRenderer extends JLable, implements TableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// Set up default state here
c.setBackground(Color.white);
c.setForeground(Color.black);
// ...
if (!isRowSelected(row) ) {
c.setBackground((hashMapcontainer
.containsKey(row)) ? Color.GREEN
: getBackground());
}
return c;
}
これにより、作成するすべての場所で JTable を拡張する必要がなくなり、再利用可能なコンポーネントが得られます。すべてのテーブルで同じセルが選択されているのは、インスタンスごとの状態ではなくグローバル状態にアクセスisRowSelected
しているためです。hashMapContainer
すべてJComponent
に と が getClientProperty
ありputClientProperty
ます。これらを使用すると、独自の状態オブジェクトを にアタッチできますJTable
。次に、あなたは にisRowSelected
なりisRowSelected(table, row)
、単に呼び出します:
MyObject myObj = (MyObject)table.getClientProperty("MySelectionProperty");
myObj.isRowSelected(row);
同様にhashMapContainer
、テーブルから取得することもできます。
MyHashContainer myHash = (MyHash)table.getClientProperty("MyHashContainer");
アップデート:
これは、動的に生成されたテーブルの場合とほとんど同じです。テーブルの作成は次のようになります。
JTable t = new JTable();
// other typical table setup, t.setModel(...); etc
t.setDefaultRenderer(String.class, myRenderer);
t.putClientProperty("MySelectionProperty", new MyObject());
t.putClientProperty("MyHashContainer", new MyHashContainer());
レンダラーが状態を保持しない限り、テーブルごとにインスタンスを作成する必要がないことに注意してください。通常は 1 つ作成し、それをすべてのテーブルに使用します。
以下は、グローバル状態を使用せず、テーブルのプロパティを参照する上記のレンダラーの更新です。
public class MyRenderer extends JLable, implements TableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// Pull hashMapContainer from the per-table client properties
MyHashContainer hashMapcontainer = (MyHashContainer)table.getClientProperty("MyHashContainer");
// Set defaults as above
if (!isRowSelected(table, row) ) {
// Same as above
}
return c;
}
// Private method to check for row selection
private boolean isRowSelected(JTable t, int row) {
int[] selectedRows = table.getSelectedRows();
for (int i = 0; i < selectedRows.length; i++) {
if (selectedRows[i] == row) {
return true;
}
}
return false;
}
}