これは、これらの質問の1つであることが判明しました:
- カスタムレンダラーで正しい状態依存のビジュアルプロパティを取得する方法を示すのは良い質問だと思います
- 簡単な例の実装とテスト
- これは期待どおりに機能していません
- デバッグ セッションの開始
...数時間後.. Nimbusの特異性にうんざりしています。
正しいことから始めます: カスタム レンダラー (どのようなタイプでも) で、テーブルの既定のレンダラーへの参照を持ち、既定のプロパティを使用してカスタム レンダリング コンポーネントを構成します。そうすれば、明示的に異なる状態にしたいことを除いて、カスタム レンダリング コンポーネントはデフォルト (選択、ストライピング、フォーカスなど) と同じように見えます。
public static class TextAreaRenderer2 extends JTextArea implements
TableCellRenderer {
private TableCellRenderer delegate;
public TextAreaRenderer2(TableCellRenderer delegate) {
this.delegate = delegate;
// initial config
Font font = new Font("Aparajita", Font.BOLD + Font.ITALIC, 16);
setFont(font);
setLineWrap(true);
setWrapStyleWord(true);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
// configure content
setText((String) value);
// get a configured component from the delegate
Component comp = delegate.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
// configure myself as appropriate
setBackground(comp.getBackground());
setForeground(comp.getForeground());
setBorder(((JComponent) comp).getBorder());
return this;
}
}
これは、各コア LAF で見栄えがします ... Nimbus を除きます。そこでは、代替色の行の領域の周りに小さな白い境界線が表示されます。一見、不透明度の欠陥のように見えます。そうです。不透明度を明示的に true に設定するのを忘れていました。
// initial config
...
setOpaque = true;
これで、行の領域の周囲に小さな暗い境界線が通常の色で表示されます。不思議なことに、その暗い色はビューポートの色です- ?
一日の終わりに (時間を飛ばして :-)、Nimbus の textArea には特別な UI 状態 NOTINSCROLLPANE があることがわかりました。その状態では、TextAreaPainter は、約 2px のインセットで縮小された領域を塗りつぶします (理由はわかりません)。レンダリングで使用しない場合、不透明度を true に設定すると、領域全体を塗りつぶすのに十分です。レンダリングに使用すると、何も役に立ちません...それをJViewportに追加し(したがって状態を偽造)、ビューポートをレンダリングコンポーネントとして返します(その違いの理由はわかりません)。
public static class TextAreaRenderer2 extends JTextArea implements
TableCellRenderer {
private TableCellRenderer delegate;
JComponent parent;
public TextAreaRenderer2(TableCellRenderer delegate) {
this.delegate = delegate;
// initial config
Font font = new Font("Aparajita", Font.BOLD + Font.ITALIC, 16);
setFont(font);
setLineWrap(true);
setWrapStyleWord(true);
parent = new JViewport();
parent.add(this);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
// configure content
setText((String) value);
// get a configured component from the delegate
Component comp = delegate.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
// configure myself as appropriate
setBackground(comp.getBackground());
setForeground(comp.getForeground());
setBorder(((JComponent) comp).getBorder());
// return the viewport we are added to
return parent;
}
}