特定の値を含む行の背景色を変更するために、いくつかの ColorHighlighters を持つ JXTreeTable を使用しています。
行が選択されている場合、色は SelectionBackground に変わります。
完全な新しいレンダラーなしで、述語またはカラー ハイライターに基づいて選択の背景色を変更することは可能ですか?
編集:行が選択されていて強調表示されている場合、強調表示されていない行のように別の背景色にする必要があります。
SSCCE
package testing;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import org.jdesktop.swingx.JXTreeTable;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.decorator.HighlightPredicate;
import org.jdesktop.swingx.treetable.AbstractMutableTreeTableNode;
import org.jdesktop.swingx.treetable.DefaultTreeTableModel;
public class JXTreeTableDemo extends JFrame {
public static void main(String[] args) {
JXTreeTableDemo gui = new JXTreeTableDemo();
// get root node and 20 child nodes
ArrayNode root = new ArrayNode(new Object[] { "root", "" });
for (int i = 0; i < 20; i++) {
root.add(new ArrayNode(new Object[] { "child", i }));
}
// get table and add root node
JXTreeTable table = new JXTreeTable(new DefaultTreeTableModel(root));
JScrollPane scrPane = new JScrollPane(table);
// predicate to highlight all VAL%3==0
HighlightPredicate predicateMod3 = new HighlightPredicate() {
@Override
public boolean isHighlighted(Component renderer,
ComponentAdapter adapter) {
if ((int) adapter.getValue(1) % 3 == 0) {
return true;
}
return false;
}
};
// predicate to highlight all VAL%4==0
HighlightPredicate predicateMod4= new HighlightPredicate() {
@Override
public boolean isHighlighted(Component renderer,
ComponentAdapter adapter) {
if ((int) adapter.getValue(1) % 4 == 0) {
return true;
}
return false;
}
};
// initialize highlighter for %3 div
ColorHighlighter highlighterMod3 = new ColorHighlighter(predicateMod3,
Color.BLUE, Color.WHITE);
// initialize highlighter for %4 div
ColorHighlighter highlighterMod4 = new ColorHighlighter(predicateMod4,
Color.GREEN, Color.WHITE);
// add highlighter
table.addHighlighter(highlighterMod3);
table.addHighlighter(highlighterMod4);
gui.getContentPane().add(scrPane);
gui.setVisible(true);
gui.pack();
}
// concrete class of AbstractMutableTreeTableNodes
static class ArrayNode extends AbstractMutableTreeTableNode {
public ArrayNode(Object[] data) {
super(data);
}
@Override
public Object getValueAt(int column) {
return getUserObject()[column];
}
@Override
public void setValueAt(Object aValue, int column) {
getUserObject()[column] = aValue;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object[] getUserObject() {
return (Object[]) super.getUserObject();
}
@Override
public boolean isEditable(int column) {
return true;
}
}
}
ここまで、ミョハネス