カスタムレンダラーを追加する場合は、通常、一部JComponent
(などJLabel
)を拡張して実装TableCellRenderer
するか、を拡張しDefaultTableCellRenderer
ます。ただし、どちらの場合でも、セルスタイルが完全に上書きされていることがわかります。
私が本当に望んでいるのは、デフォルトのL&F背景をペイントしてから、前景色やフォントなどの他のL&Fデフォルトを使用してその上にペイントできるようにすることです。
だから、これが私がやろうとしたことです。まず、クラス:
public class IntervalHeaderRenderer extends JLabel implements TableCellRenderer {
private TableCellRenderer delegate;
private Component component;
public IntervalHeaderRenderer(TableCellRenderer defaultRenderer)
{
this.delegate = defaultRenderer;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
component = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
// Maybe override some settings.
// You could make the label bold, for instance.
return component;
// return this;
}
@Override
public void paint(Graphics g) {
// What I really want to do is paint the original component
component.paint(g);
// And then draw on top of it.
}
}
次に、セル(ヘッダー)レンダラーを次のようにオーバーライドします。
TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
table.getColumnModel().getColumn(1).setHeaderRenderer(new IntervalHeaderRenderer(renderer));
私は基本的にここでの提案に従っています: TableCellRenderer、パート2-カスタムレンダラーを作成する方法
を返すcomponent
と、何もオーバーライドしていないかのようにレンダリングされます。つまり、選択したL&Fの背景とスタイル、およびすべてでプログラムしたラベルのヘッダーを取得します。 しかし、もちろん、後で私のものをレンダリングする方法はありません。
一方、私が戻った場合this
、私はまったく何も得られません。MacネイティブのL&Fは私に白い背景を与え、Nimbusは私に他の色の無地を与えます。
私は明らかに何かが欠けています。Component
オーバーライドして元のメソッドに転送する必要がある他のメソッドはありますか?オーバーライドしない場合、デフォルトのコンポーネントはどのように描画されますpaint
か?(私もオーバーライドを試みましたpaintComponent
。違いはありません。)
これを行う別の方法はありますか?ネイティブスタイルJPanel
をそこにドロップしてから、カスタム(透明な背景)コンポーネントをその子にすることを考えましたが、その方法はわかりません。また、取得できるかどうかもわかりません。とにかくネイティブL&Fテーブルヘッダーの背景。実際、ネイティブのヘッダースタイル、つまりネイティブスタイルだけを取得できるかどうかは非常に疑わしいですJPanel
。
基本的に、カスタムテーブルヘッダー(および個別に、実際にはセルも)が必要ですが、ネイティブL&Fを過度に混乱させないようにします。
ありがとう!