10

セルをクリックしたときにテーブルで行全体を選択しようとしています (これは、列の選択をオフにすることで実行できます) が、クリックした特定のセルの周りの余分な太い境界線を強調表示したくありません。これが簡単になることを望んでいましたが、どうやらレンダラーが関係しているようですので、多くの調査を行いました。

    JTable contactTable = new JTable(tableModel);

    contactTable.setCellSelectionEnabled(true);
    contactTable.setColumnSelectionAllowed(false);
    contactTable.setRowSelectionAllowed(false);
    contactTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    // This renderer extends a component. It is used each time a
    // cell must be displayed.
    class MyTableCellRenderer extends JLabel implements TableCellRenderer {
        // This method is called each time a cell in a column
        // using this renderer needs to be rendered.
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
            // 'value' is value contained in the cell located at
            // (rowIndex, vColIndex)

            if (isSelected) {
                // cell (and perhaps other cells) are selected

            }

            if (hasFocus) {
                // this cell is the anchor and the table has the focus
                this.setBackground(Color.blue);
                this.setForeground(Color.green);
            } else {
                this.setForeground(Color.black);
            }

            // Configure the component with the specified value
            setText(value.toString());

            // Set tool tip if desired
            // setToolTipText((String)value);

            // Since the renderer is a component, return itself
            return this;
        }

        // The following methods override the defaults for performance reasons
        public void validate() {}
        public void revalidate() {}
        protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
        public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
    }

    int vColIndex = 0;
    TableColumn col = contactTable.getColumnModel().getColumn(vColIndex);
    col.setCellRenderer(new MyTableCellRenderer());

例から Renderer をコピーし、必要な色を使用するように hasFocus() 関数のみを変更しました。色を設定しisSelected()ても何も起こりませんでした。

このコードの問題は次のとおりです。

  1. 下部の vColIndex で指定された 1 つの列でのみ機能します。明らかに、これをすべての列に適用したいので、1 つのセルをクリックすると行全体が強調表示されます。forループを作成してすべてのセルに変更することもできますが、すべての列のcellRendererを一度に変更するより良い方法があると思います。

  2. setForegroundColor()テキストを変更するために機能しますがsetBackgroundColor()、セルの背景には何もしません。プロパティが示すように、実際に背景色を変更したいと思います。

    • #2 の解決策: this.setOpaque(true);backgroundcolor を割り当てる前に使用します。
  3. レンダラーが機能する場合、単一のセルでのみ機能します。行内のすべてのセルに色を付けるにはどうすればよいですか?

    • #3 の解決策: わかった! 単一のセルにのみ影響するを使用する代わりに、hasFocus()行の選択 ( ) を有効にする場合は、ステートメントtable.setRowSelectionAllowed(true)に色の変更を入れます。if(isSelected)次に、行全体が選択されたと見なされ、すべてのセルに色が付けられます!

3 は大きなものでしたが、誰かが #1 を知っているか、レンダラーを一度に 1 つの列にしか適用できないように設計された理由を説明していただければ幸いです。

4

3 に答える 3

15

直接すぎて行を追加するだけです

tablename.setSelectionBackground(Color.red);

私の場合

jtbillItems.setSelectionBackground(Color.red);
于 2012-05-24T18:13:19.883 に答える
5

チュートリアルの記事「Concepts: Editors and Renderers 」では、モデルのメソッドによって返されるように、「通常、単一のセル レンダラーを使用して、同じタイプのデータを含むすべてのセルを描画する」と説明しています。getColumnClass()

または、すべてのprepareRenderer()セルに対して呼び出されるoverrideを使用して、行の外観を選択的に変更します。このでは 2 つのアプローチを比較し、記事「Table Row Rendering」ではアプローチの汎用性について詳しく説明しています。

于 2012-04-05T02:34:48.650 に答える
0

2 番目の質問では、setSelectionBackground(Color) および setSelectionForeGround(Color) メソッドを試すことができます。最初の問題をどのように解決できるかわかりません。最後に、JBuilder などのスイング デザイナー プラグインを使用することをお勧めします。それは大いに役立ちます。

于 2012-04-04T19:32:43.807 に答える