1

複数行のセルでテーブルを作成しましたが、うまくいきましたが、列全体の色ではなく、特定の列の複数行セルを作成した後、単一の行の色を変更したいと考えています。どうやってやるの?

これは列2の複数行セルを作成した後の画像ですが、列全体が白くなります ここに画像の説明を入力

これは私がしたことです:

jTable1.getColumnModel().getColumn(1).setCellRenderer( new TextAreaRenderer2()); 

String test = "sunday \n monday ";

jTable1.getModel().setValueAt(test, 0, 3);
jTable1.getModel().setValueAt(test, 0, 1);
jTable1.getModel().setValueAt(test, 0, 2);

これは TextAreaRenderer2 クラスです:

public class TextAreaRenderer2 extends JTextArea
     implements TableCellRenderer {

     public TextAreaRenderer2() {

         Font font = new Font("Aparajita", Font.BOLD + Font.ITALIC, 16);

         setLineWrap(true);
         setWrapStyleWord(true);
         setBackground(Color.yellow);
         setBorder(BorderFactory.createEmptyBorder());
         setFont(font);

     } 

     @Override
     public Component getTableCellRendererComponent(JTable jTable,
          Object obj, boolean isSelected, boolean hasFocus, int row,
          int column) {

         setText((String)obj);
         setBackground(Color.WHITE);


         return this;
     }
 }
4

2 に答える 2

1

これは、これらの質問の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;
    }
}
于 2012-09-01T15:13:41.530 に答える
1

TableAreaRenderer2クラスのgetTableCellRendererComponentメソッドで、行に基づいて背景色を設定する必要があります。このようなもの:

if (row % 6 < 3) {
  setBackground(Color.LIGHT_GRAY);
} else {
  setBackground(Color.WHITE);
}

上記のコードは、3 行を明るい灰色にし、次の 3 行を白にして、同じパターンを繰り返します。

于 2012-08-31T18:05:33.360 に答える