Swing/TreeCellSelectionBackground のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TreeCellSelectionBackground へ行く。
- 1 (2015-12-07 (月) 02:48:30)
- 2 (2015-12-24 (木) 18:49:43)
- 3 (2016-05-24 (火) 19:32:57)
- 4 (2017-03-30 (木) 13:56:16)
- 5 (2017-04-07 (金) 13:51:51)
- 6 (2018-03-07 (水) 19:07:38)
- 7 (2018-12-21 (金) 14:11:42)
- 8 (2020-11-25 (水) 00:59:54)
- 9 (2023-02-22 (水) 11:11:15)
- 10 (2025-01-03 (金) 08:57:02)
- 11 (2025-01-03 (金) 09:01:23)
- 12 (2025-01-03 (金) 09:02:38)
- 13 (2025-01-03 (金) 09:03:21)
- 14 (2025-01-03 (金) 09:04:02)
- category: swing
folder: TreeCellSelectionBackground
title: NimbusLookAndFeelでJTreeのセル選択を行全体ではなくノードに限定する
tags: [JTree, LookAndFeel, NimbusLookAndFeel, UIDefaults]
author: aterai
pubdate: 2015-12-07T02:44:17+09:00
description: JTreeのセル選択色で塗りつぶす範囲をNimbusLookAndFeelのデフォルトになっている行全体ではなくノードのみになるように設定します。
image:
Summary
JTree
のセル選択色で塗りつぶす範囲をNimbusLookAndFeel
のデフォルトになっている行全体ではなくノードのみになるように設定します。
Screenshot

Advertisement
Source Code Examples
UIDefaults def = new UIDefaults();
JTree tree = new JTree();
tree.putClientProperty("Nimbus.Overrides", def);
tree.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
tree.setBackground(Color.WHITE);
tree.setCellRenderer(new DefaultTreeCellRenderer() {
private final Color selectionBackground = new Color(0x39_69_8A);
@Override public Component getTreeCellRendererComponent(
JTree tree, Object value, boolean selected, boolean expanded,
boolean isLeaf, int row, boolean focused) {
JComponent c = (JComponent) super.getTreeCellRendererComponent(
tree, value, selected, expanded, isLeaf, row, focused);
if (selected) {
c.setBackground(selectionBackground);
c.setOpaque(true);
} else {
c.setOpaque(false);
}
return c;
}
});
View in GitHub: Java, KotlinExplanation
上記のサンプルでは、NimbusLookAndFeel
がデフォルトで使用するセルレンダラーなどを空にしたUIDefaults
をJTree
に設定し、選択時にノードのみ背景色で塗りつぶしを行うセルレンダラーをJTree#setCellRenderer(...)
で設定して使用しています。
- 親ノードの左に表示される三角のアイコン(
collapsedIcon
、expandedIcon
)が選択されている場合の色を変更する方法がない?
UIDefaults def = new UIDefaults();
def.put("Tree.selectionBackground", Color.WHITE);
def.put("Tree.selectionForeground", Color.GREEN);
def.put("Tree.opaque", Boolean.FALSE);
def.put("Tree:TreeCell[Enabled+Selected].textForeground", Color.GREEN);
def.put("Tree.rendererFillBackground", true);
def.put("Tree.repaintWholeRow", true);
def.put("Tree:TreeCell[Enabled+Selected].backgroundPainter", new Painter<JComponent>() {
@Override public void paint(Graphics2D g, JComponent c, int w, int h) {
// g.setPaint(Color.RED);
// g.fillRect(0, 0, w, h);
}
});
def.put("Tree:TreeCell[Focused+Selected].backgroundPainter", new Painter<JComponent>() {
@Override public void paint(Graphics2D g, JComponent c, int w, int h) {
// g.setPaint(Color.RED);
// g.fillRect(0, 0, w, h);
}
});
def.put("Tree[Enabled].collapsedIconPainter", null);
def.put("Tree[Enabled].expandedIconPainter", null);
def.put("Tree[Enabled+Selected].collapsedIconPainter", null);
def.put("Tree[Enabled+Selected].expandedIconPainter", null);
Reference
- swing - JTree Nimbus Selectionbackground not Working on Java 1.8 - Stack Overflow
- JTreeを行クリックで選択し、行全体を選択状態の背景色で描画
MetalLookAndFeel
などでノードだけではなく行全体の選択を行うサンプル