1

ステータス( 、、 )JTableとともにデータを表示するを使用しています。各ステータス行には異なる色があり、これは のオーバーロードによって実現されます。NewProcessedClosedprepareRenderer()JTable

次に、そのテーブルをソートする必要があり、それtable.setAutoCreateRowSorter(true);を達成するために使用しています。行は適切にソートされますが、行の色は同じままです。この操作の後、ステータス列に基づいてすべての行に色を再適用する必要があります。

それを達成するための最良の方法は何だろうと考えていました。私が考えることができるいくつかの方法があります:

  1. テーブルを再描画/再検証します。しかし、これを単に行うだけではうまくいかないと思います。
  2. イベントをキャプチャmouseClickedし、列ヘッダーがクリックされたかどうかを識別し、prepareRenderer()手動で呼び出してから、再描画/再検証を呼び出します
  3. 次に、ここで質問の1つを読みました.答えの1つは、再描画/再検証を直接呼び出すのではなく、基礎となるデータモデルを変更すると、上記のメソッドが自動的に呼び出されます.

どうすればいいのかわかりません。これを達成するための正しい方法は何ですか?

4

1 に答える 1

8

セルの色を変更するJTableには、setAutoCreateRowSorter(true)メソッドtable.getRowSorter().convertRowIndexToModel(row)を使用 しましたTableCellRenderer

import javax.swing.*;

import javax.swing.table.DefaultTableCellRenderer;

import javax.swing.table.TableModel;

import java.awt.*;

public class OwnTableCellRenderer extends DefaultTableCellRenderer {

    public OwnTableCellRenderer() {
        super();
        setOpaque(true);
    }

    public Component getTableCellRendererComponent(JTable table, 
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus, 
                                                   int row, 
                                                   int column) {

        setBackground(Color.white);
        setForeground(Color.black);

        TableModel model = table.getModel();
        int modelRow = table.getRowSorter().convertRowIndexToModel(row);
        int columnStatusPosition = 5;
        String statusColumnValue = (String) model.getValueAt(modelRow, columnStatusPosition);

        if (statusColumnValue.equals("ACTIVE")) {
            if (isSelected) {
                setBackground(Color.green);
            } else {
                setBackground(Color.yellow);
            }
        }

        setText(value != null ? value.toString() : "");
        return this;
    }
}

その後

table.setDefaultRenderer(Object.class, new OwnTableCellRenderer());
于 2012-04-05T19:45:40.330 に答える