为单个JTree定制Tree.collapsedIcon

我知道您可以使用UImanager器使用Swing更改应用程序中所有JTreesUImanager 。 例如:

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

我想在同一个应用程序中为各个JTrees更改Tree.collapsedIcon的灵活性,最终结果是Tree.collpasedIcon对于同一个应用程序中的不同树可能会有不同的显示。

我知道如何使用自定义渲染器自定义单个图标。 例如,我使用setIcon设置叶子的图标, SetOpenIcon设置节点的图标,该节点在展开时具有子节点,而SetCloseIcon对不具有子节点的节点执行相同操作。

但是除了使用具有上述限制的UIManager ,我没有看到如何为Tree.collapsedIcon执行此操作。

有人知道怎么做吗?

另一种方法是在构造每棵树时调节UIManager 。 在下面的示例中,静态工厂提供了所需的Icon对。 该示例借用MetalLookAndFeel中的两个图标进行对比。 这里看到的自定义图标也是可能的。

 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); } } 

如果您假设您使用的TreeUI是BasicTreeUIinstance of BasicTreeUI可以执行以下操作:

 TreeUI tui = treeInstance.getUI(); if (tui instanceof BasicTreeUI) { ((BasicTreeUI)tui).setCollapsedIcon(myIcon); } 

我能看到的唯一方法是从Java源代码创建自己的JTree版本,允许您为每个JTree定义图标。

我看到JTree从javax.accessibility.AccessibleContext获取了图标,最终获得了一些AccessibleIcon接口的定义类。