Swing/TranslucentTree のバックアップソース(No.8)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/TranslucentTree へ行く。
- 1 (2014-09-20 (土) 16:01:51)
- 2 (2014-10-10 (金) 01:34:53)
- 3 (2014-10-20 (月) 19:50:05)
- 4 (2014-11-27 (木) 19:01:37)
- 5 (2015-01-29 (木) 17:40:36)
- 6 (2015-04-08 (水) 17:13:09)
- 7 (2017-03-03 (金) 11:57:52)
- 8 (2017-03-28 (火) 15:14:11)
- 9 (2018-01-28 (日) 18:49:03)
- 10 (2018-02-24 (土) 19:51:30)
- 11 (2020-01-16 (木) 20:29:25)
- 12 (2021-07-16 (金) 09:03:34)
--- category: swing folder: TranslucentTree title: JTreeを透明にし、選択状態を半透明にする tags: [JTree, Translucent, Transparent, TreeCellRenderer, UIDefaults] author: aterai pubdate: 2013-01-14T00:01:16+09:00 description: JTreeの背景を透明にし、ノードの選択色を半透明にします。 image: https://lh4.googleusercontent.com/-HxmekrVRX6M/UPLEn6O6-VI/AAAAAAAABbM/XJoGyl2khVM/s800/TranslucentTree.png hreflang: href: http://java-swing-tips.blogspot.com/2014/11/make-transparent-jtree-and-translucent.html lang: en --- * 概要 [#summary] `JTree`の背景を透明にし、ノードの選択色を半透明にします。 #download(https://lh4.googleusercontent.com/-HxmekrVRX6M/UPLEn6O6-VI/AAAAAAAABbM/XJoGyl2khVM/s800/TranslucentTree.png) * サンプルコード [#sourcecode] #code(link){{ 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; } } }} * 解説 [#explanation] - 左: `TreeCellRenderer`を半透明化 -- `JTree#setOpaque(false);`として`JTree`や`JScrollPane`などを透明化 -- `DefaultTreeCellRenderer#getBackgroundNonSelectionColor(...)`をオーバーライドしてノードの背景色を透明化 -- `DefaultTreeCellRenderer#getBackgroundSelectionColor(...)`をオーバーライドしてノードの選択色を半透明化 - 右: `TreeCellRenderer`を透明化 -- `JTree#setOpaque(false);`として`JTree`や`JScrollPane`などを透明化 -- `DefaultTreeCellRenderer#getBackgroundNonSelectionColor(...)`をオーバーライドしてノードの背景色を透明化 -- `DefaultTreeCellRenderer#getBackgroundSelectionColor(...)`をオーバーライドしてノードの選択色を透明化 -- `JTree#paintComponent(...)`をオーバーライドして、半透明の選択色で`JTree`に直接選択状態を描画 --- 参考: [[JTreeを行クリックで選択し、行全体を選択状態の背景色で描画>Swing/TreeRowSelection]] ---- - `SynthLookAndFeel`系の`NimbusLookAndFeel`の場合、以下のような何も描画しない`Painter`をノード選択に使用することで、選択色を半透明にすることができる -- ただし、同じ`SynthLookAndFeel`系でも、`GTKLookAndFeel`の場合は、[[SynthでJInternalFrameを半透明にする>Swing/TranslucentFrame]]のように、`SynthStyle#isOpaque(...)`が`Region.TREE_CELL`の時は`false`になるように設定する必要がある #code{{ //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); }} * 参考リンク [#reference] - [[JTreeを行クリックで選択し、行全体を選択状態の背景色で描画>Swing/TreeRowSelection]] - [[JRootPaneの背景として画像を表示>Swing/RootPaneBackground]] * コメント [#comment] #comment #comment