2

カスタムセルレンダラーを備えたJXTreeTableがあります。行のフィールドが前の行のフィールドと異なる場合に、行の背景色を変更しようとしています。たとえば、行にIDとして「1」が含まれているとします。前の行にも「1」が含まれている場合は、この行を同じ色でペイントします。前が「2」だった場合、この行を別の色でペイントしたいと思います。目的は、同じIDを持つ行をグループ化することです。

私は元々、以前にペイントした色を保存し、それを(値とともに)使用して、現在の行をペイントする色を決定していました。ただし、これはテーブルを上から下に完全にペイントする場合にのみ機能しました。私は現在、前の行の背景色を取得し、それを使用して決定していますが、行が選択されているか、そうでなければ異なる場合、これは色を台無しにします。これを行うためのより良い方法はありますか?

public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
    Component c = super.prepareRenderer(renderer, row, column);
    Object node = this.getPathForRow(row).getLastPathComponent();

    if(node instanceof Record && !isCellSelected(row,column)) {
    Object prevNode = null;
    Component prevC = null;
    if(row > 1) {
        prevC = super.prepareRenderer(renderer, row-1, column);
        prevNode = this.getPathForRow(row-1).getLastPathComponent();
    }
        if(row != prevRow) { //paint rows the same colour
            if(getTreeTableModel().getValueAt(node,17) != null) {
                if (prevNode != null) {
                    if(getTreeTableModel().getValueAt(prevNode, 17) == getTreeTableModel().getValueAt(node, 17)) { 
                        c.setBackground(prevC.getBackground()); //if ID is same as previous ID, paint same colour
                        prevColor = prevC.getBackground();
                    }else if(prevC.getBackground().equals(Color.WHITE)) {;
                        c.setBackground(new Color(240,255,255)); //if previous row was white, paint blue
                        prevColor = new Color(240,255,255);
                    }else if(prevC.getBackground().equals(new Color(240,255,255))) {                            
                        c.setBackground(Color.WHITE); //if previous row blue, paint white
                        prevColor = Color.WHITE;
                    }
                } else {
                    c.setBackground(Color.WHITE); //previous node is null 
                    prevColor = Color.WHITE;
                }
            }
        } else {
            c.setBackground(prevColor);
        }
    }
    prevRow = row;
    return c;
}
4

2 に答える 2

1

データをあまり変更しない場合は、各IDの色を事前に決定し、毎回背景を設定する前にそれらを検索することができます。

于 2011-03-01T13:02:49.057 に答える
1

行のフィールドが前の行のフィールドと異なる場合に、行の背景色を変更しようとしています

行のデータに基づいてバックグラウンドレンダリングを実行しようとしている場合は、テーブル行レンダリングのアプローチを使用します。

于 2011-03-01T16:04:32.473 に答える