3

を使用してSwingを使用するアプリケーションでTree.collapsedIcon、すべてのを変更できることを知っています。例えば:JTreesUImanager

UIManager.put("Tree.collapsedIcon",closedcabinet);

同じアプリケーションでTree.collapsedIcon個人のforを変更できる柔軟性が必要です。その結果、同じアプリケーションの異なるツリーでは、が異なって表示される可能性があります。 JTreesTree.collpasedIcon

カスタムレンダラーを使用して個々のアイコンをカスタマイズする方法を知っています。たとえばsetIcon、葉のアイコンSetOpenIconを設定したり、展開時に子を持つノードのアイコンを設定したり、展開されSetCloseIconていないノードに対して同じことを行ったりするために使用します。

しかし、上記のような制限があるを Tree.collapsedIcon使用する以外に、これを行う方法がわかりません。UIManager

誰もがこれを行う方法を知っていますか?

4

3 に答える 3

6

使用しているTreeUIがであると仮定するとinstance of BasicTreeUI、次のことができます。

TreeUI tui = treeInstance.getUI();
if (tui instanceof BasicTreeUI) {
  ((BasicTreeUI)tui).setCollapsedIcon(myIcon);
}
于 2013-01-10T15:02:08.527 に答える
5

別のアプローチは、UIManager各ツリーを構築するときにを調整することです。以下の例では、静的ファクトリが必要なIconペアを提供します。MetalLookAndFeelこの例では、対比のためにから2つのアイコンを借用しています。ここに表示されているカスタムアイコンも可能です。

frame.add(new JTreePanel(Icons.getDefault()));
frame.add(new JTreePanel(Icons.getMetal()));

画像

SSCCE:

import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.metal.MetalLookAndFeel;

/** @see https://stackoverflow.com/a/14262706/230513 */
public class JTreePanel extends JPanel {

    public static final class Icons {

        private static final String COLLAPSED_ICON = "Tree.collapsedIcon";
        private static final String EXPANDED_ICON = "Tree.expandedIcon";
        private Icon collapsed;
        private Icon expanded;

        public static Icons getDefault() {
            Icons icons = new Icons();
            icons.collapsed = (Icon) UIManager.get(COLLAPSED_ICON);
            icons.expanded = (Icon) UIManager.get(EXPANDED_ICON);
            return new Icons();
        }

        public static Icons getMetal() {
            Icons icons = new Icons();
            try {
                LookAndFeel save = UIManager.getLookAndFeel();
                LookAndFeel laf = new MetalLookAndFeel();
                UIManager.setLookAndFeel(laf);
                icons.collapsed = (Icon) UIManager.get(COLLAPSED_ICON);
                icons.expanded = (Icon) UIManager.get(EXPANDED_ICON);
                UIManager.setLookAndFeel(save);
            } catch (UnsupportedLookAndFeelException ex) {
                ex.printStackTrace(System.err);
            }
            return icons;
        }
    }

    public JTreePanel(Icons pair) {
        UIManager.put("Tree.collapsedIcon", pair.collapsed);
        UIManager.put("Tree.expandedIcon", pair.expanded);
        JTree tree = new JTree();
        this.add(tree);
        for (int i = 0; i < tree.getRowCount(); i++) {
            tree.expandRow(i);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createGUI();
            }
        });
    }

    private static void createGUI() {
        final JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(1, 0));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JTreePanel(Icons.getDefault()));
        frame.add(new JTreePanel(Icons.getMetal()));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
于 2013-01-10T16:33:17.810 に答える
0

私が見ることができる唯一の方法は、各JTreeのアイコンを定義できるJavaソースコードから独自のバージョンのJTreeを作成することです。

JTreeがjavax.accessibility.AccessibleContextからアイコンを取得し、最終的にはAccessibleIconインターフェイスの定義済みクラスを取得していることがわかります。

于 2013-01-10T15:01:48.067 に答える