4

カスタムレンダラーを追加する場合は、通常、一部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を過度に混乱させないようにします。

ありがとう!

4

2 に答える 2

3

updateUI()で採用されたアプローチSelectAllHeaderTestと、受け​​入れられた回答の有用な警告を見ることができます。

補遺:説明として、ヘッダーの外観は、通常はから派生した、ホストプラットフォームの対応するUIデリゲートの管理下にあることに注意してくださいTableHeaderUI。一般的なルックアンドフィールの実装に共通するUIManagerのデフォルトに変更を限定することをお勧めします。また、をオーバーライドしないでくださいpaint()。オーバーライドは避けますpaintComponent(); そして、必要に応じて、paintIcon()に示すように、をオーバーライドしますTableSorter

于 2011-09-19T02:35:56.963 に答える
0

ソースコードを確認DefaultTableCellRendererすると、デフォルトの動作で次のようなデフォルトの色がどのように読み取られるかがわかります。

        fg = DefaultLookup.getColor(this, ui, "Table.dropCellForeground");
        bg = DefaultLookup.getColor(this, ui, "Table.dropCellBackground");
于 2013-04-11T19:53:26.223 に答える