• title: JTreeを透明にし、選択状態を半透明にする tags: [JTree, Translucent, Transparent, TreeCellRenderer, UIDefaults] author: aterai pubdate: 2013-01-14T00:01:16+09:00 description: JTreeの背景を透明にし、ノードの選択色を半透明にします。 hreflang:
       href: http://java-swing-tips.blogspot.com/2014/11/make-transparent-jtree-and-translucent.html
       lang: en

概要

JTreeの背景を透明にし、ノードの選択色を半透明にします。

サンプルコード

class TransparentTreeCellRenderer extends DefaultTreeCellRenderer {
  @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;
  }
  private final Color ALPHA_OF_ZERO = new Color(0, true);
  @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, Kotlin

解説

  • 左: TreeCellRendererを半透明化
    • JTree#setOpaque(false);としてJTreeJScrollPaneなどを透明化
    • DefaultTreeCellRenderer#getBackgroundNonSelectionColor(...)をオーバーライドしてノードの背景色を透明化
    • DefaultTreeCellRenderer#getBackgroundSelectionColor(...)をオーバーライドしてノードの選択色を半透明化
  • 右: TreeCellRendererを透明化
    • JTree#setOpaque(false);としてJTreeJScrollPaneなどを透明化
    • 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);

参考リンク

コメント