Swing/MiddleXOfRootNodeIcon の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/MiddleXOfRootNodeIcon へ行く。
- Swing/MiddleXOfRootNodeIcon の差分を削除
--- category: swing folder: MiddleXOfRootNodeIcon title: JTreeのルートノードアイコンのサイズを変更し、その中央に接続線が描画されるように設定する tags: [JTree, JLayer, TreeCellRenderer, Icon] author: aterai pubdate: 2016-11-21T02:08:30+09:00 description: JTreeのルートノードアイコンのみ、そのサイズを拡大し、アイコンの中央に垂直の接続線が描画されるように設定します。 image: https://drive.google.com/uc?id=1L1Zx1voPr1qT2nXuxhHn1hJ8Kzqg1mK95A --- * 概要 [#summary] `JTree`のルートノードアイコンのみ、そのサイズを拡大し、アイコンの中央に垂直の接続線が描画されるように設定します。 #download(https://drive.google.com/uc?id=1L1Zx1voPr1qT2nXuxhHn1hJ8Kzqg1mK95A) * サンプルコード [#sourcecode] #code(link){{ int ow = UIManager.getIcon("Tree.openIcon").getIconWidth(); int iw = 32; int ih = 24; Icon icon1 = new ColorIcon(Color.GREEN, new Dimension(ow, ih)); Icon icon2 = new ColorIcon(new Color(0x55_00_00_AA, true), new Dimension(iw, ih)); JTree tree = new JTree(); tree.setRowHeight(0); tree.setBorder(BorderFactory.createEmptyBorder(1, 1 + (iw - ow) / 2, 1, 1)); tree.setCellRenderer(new DefaultTreeCellRenderer() { @Override public Component getTreeCellRendererComponent( JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { JLabel l = (JLabel) super.getTreeCellRendererComponent( tree, value, selected, expanded, leaf, row, hasFocus); if (value.equals(tree.getModel().getRoot())) { l.setIcon(icon1); l.setIconTextGap(2 + (iw - icon1.getIconWidth()) / 2); } return l; } }); LayerUI<JTree> layerUI = new LayerUI<JTree>() { @Override public void paint(Graphics g, JComponent c) { super.paint(g, c); Graphics2D g2 = (Graphics2D) g.create(); icon2.paintIcon(c, g2, 1, 1); g2.dispose(); } }; }} * 解説 [#explanation] - 左: デフォルト -- `tree.setRowHeight(0)`でセルレンダラーが行の高さを決めるように設定 -- `tree.setRowHeight(0)`で`TreeCellRenderer`が行の高さを決めるように設定 -- ルートノードのアイコンのみサイズを変更する`TreeCellRenderer`を設定 -- ルートノードアイコンを繋ぐ垂直の接続線は左側寄りの位置に描画される - 右: `setBorder` + `JLayer` -- `tree.setRowHeight(0)`でセルレンダラーが行の高さを決めるように設定 -- `tree.setRowHeight(0)`で`TreeCellRenderer`が行の高さを決めるように設定 -- `JTree`に別途`JLayer`で描画するルートノードのアイコンの幅だけ余白を設定 --- `UIManager.put("Tree.padding", 10)`は`SynthLookAndFeel`でのみ有効? -- ルートノードのアイコンのみ幅はデフォルトで高さを変更する`TreeCellRenderer`を設定 --- `JLabel#setIconTextGap(...)`メソッドで別途`JLayer`で描画するアイコンの幅だけ余白を設定しておく -- 本来`JTree`のルートノードアイコンとして設定したいアイコンを`JLayer`を使用して描画 -- ルートノードアイコンを繋ぐ垂直の接続線は中央に描画される * 参考リンク [#reference] - [https://stackoverflow.com/questions/40544376/jtree-move-nodes-to-the-right java - JTree - Move nodes to the right - Stack Overflow] * コメント [#comment] #comment #comment