概要

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

サンプルコード

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, Kotlin

解説

  • 左: TreeCellRendererを半透明化
    • 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);

参考リンク

コメント