概要
JTree
のセル背景を交互に別の色で描画して縞模様になるよう設定します。
Screenshot
Advertisement
サンプルコード
class AlternateRowColorTree extends JTree {
private static final Color SELECTED_COLOR = new Color(0x64_32_64_FF, true);
@Override protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(new Color(0xCC_CC_CC));
IntStream.range(0, getRowCount())
.filter(i -> i % 2 == 0)
.mapToObj(this::getRowBounds)
.forEach(r -> g2.fillRect(0, r.y, getWidth(), r.height));
int[] selections = getSelectionRows();
if (selections != null) {
g2.setPaint(SELECTED_COLOR);
Arrays.stream(selections)
.mapToObj(this::getRowBounds)
.forEach(r -> g2.fillRect(0, r.y, getWidth(), r.height));
super.paintComponent(g);
if (hasFocus()) {
Optional.ofNullable(getLeadSelectionPath()).ifPresent(path -> {
Rectangle r = getRowBounds(getRowForPath(path));
g2.setPaint(SELECTED_COLOR.darker());
g2.drawRect(0, r.y, getWidth() - 1, r.height - 1);
});
}
}
super.paintComponent(g);
g2.dispose();
}
@Override public void updateUI() {
super.updateUI();
UIManager.put("Tree.repaintWholeRow", Boolean.TRUE);
setCellRenderer(new TransparentTreeCellRenderer());
setOpaque(false);
}
}
View in GitHub: Java, Kotlin解説
JTree#paintComponent(...)
をオーバーライドして縞模様を描画TreeCellRenderer
で選択状態の背景は描画せず、代わりにJTree#paintComponent(...)
で縞模様のあとに選択状態を行全体に拡張して描画- JTreeを行クリックで選択し、行全体を選択状態の背景色で描画
参考リンク
- JTreeを行クリックで選択し、行全体を選択状態の背景色で描画
- TableCellRendererでセルの背景色を変更
- Feature Request: custom alternate row color on Tree · Issue #900 · JFormDesigner/FlatLaf