JTreeを透明にし、選択状態を半透明にする
Total: 4958, Today: 1, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
JTreeの背景を透明にし、ノードの選択色を半透明にします。
Screenshot

Advertisement
Source Code Examples
class TransparentTreeCellRenderer extends DefaultTreeCellRenderer {
private final Color ALPHA_OF_ZERO = new Color(0x0, true);
@Override public Component getTreeCellRendererComponent(
JTree tree, Object value, boolean isSelected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
JComponent c = (JComponent) super.getTreeCellRendererComponent(
tree, value, isSelected, expanded, leaf, row, hasFocus);
c.setOpaque(false);
return c;
}
@Override public Color getBackgroundNonSelectionColor() {
return ALPHA_OF_ZERO;
}
@Override public Color getBackgroundSelectionColor() {
return ALPHA_OF_ZERO;
}
}
class TranslucentTreeCellRenderer extends TransparentTreeCellRenderer {
private final Color backgroundSelectionColor = new Color(100, 100, 255, 100);
@Override public Color getBackgroundSelectionColor() {
return backgroundSelectionColor;
}
}
View in GitHub: Java, KotlinDescription
- 左:
TreeCellRendererを半透明化setOpaque(false)でJTreeとJScrollPaneを透明化DefaultTreeCellRenderer#getBackgroundNonSelectionColor(...)をオーバーライドしてノードの背景色を透明化DefaultTreeCellRenderer#getBackgroundSelectionColor(...)をオーバーライドしてノードの選択色を半透明化
- 右:
TreeCellRendererを透明化JTree#setOpaque(false);としてJTreeやJScrollPaneなどを透明化DefaultTreeCellRenderer#getBackgroundNonSelectionColor(...)をオーバーライドしてノードの背景色を透明化DefaultTreeCellRenderer#getBackgroundSelectionColor(...)をオーバーライドしてノードの選択色を透明化JTree#paintComponent(...)をオーバーライドして半透明の選択色でJTreeに直接選択状態を描画
SynthLookAndFeel系のNimbusLookAndFeelの場合、以下のような何も描画しないPainterをノード選択に使用することでその選択色は半透明になる- ただし同じ
SynthLookAndFeel系でもGTKLookAndFeelの場合はSynthでJInternalFrameを半透明にするのようにSynthStyle#isOpaque(...)がRegion.TREE_CELLの時はfalseになるように設定する必要がある
- ただし同じ
// NimbusLookAndFeel(SynthLookAndFeel) JDK 1.7.0
UIDefaults d = new UIDefaults();
d.put("Tree:TreeCell[Enabled+Selected].backgroundPainter", new Painter<JComponent>() {
@Override public void paint(Graphics2D g, JComponent c, int width, int height) {
// Do nothing
}
});
tree2.putClientProperty("Nimbus.Overrides", d);
tree2.putClientProperty("Nimbus.Overrides.InheritDefaults", false);