我知道您可以使用Tree.collapsedIcon
使用Swing更改应用中所有JTrees
的{{1}}。例如:
UImanager
我希望在同一个应用程序中更改UIManager.put("Tree.collapsedIcon",closedcabinet);
个人Tree.collapsedIcon
的灵活性,最终结果是JTrees
对于同一应用程序中的不同树可能会有不同的显示方式。
我知道如何使用自定义渲染器自定义单个图标。例如,我使用Tree.collpasedIcon
来设置叶子的图标,setIcon
来设置在展开时具有子节点的节点的图标,并为SetOpenIcon
为节点设置相同的图标不。
但除了使用具有上述限制的SetCloseIcon
之外,我不知道如何为Tree.collapsedIcon
执行此操作。
任何人都知道怎么做?
答案 0 :(得分:6)
如果您假设您使用的TreeUI是instance of
BasicTreeUI
,则可以执行以下操作:
TreeUI tui = treeInstance.getUI();
if (tui instanceof BasicTreeUI) {
((BasicTreeUI)tui).setCollapsedIcon(myIcon);
}
答案 1 :(得分:5)
另一种方法是在构造每棵树时调整UIManager
。在下面的示例中,静态工厂提供了所需的Icon
对。该示例借用MetalLookAndFeel
中的两个图标进行对比。可以看到here的自定义图标。
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);
}
}
答案 2 :(得分:0)
我能看到的唯一方法是从Java source code创建自己的JTree版本,允许您为每个JTree定义图标。
我看到JTree从javax.accessibility.AccessibleContext获取了图标,并最终获得了AccessibleIcon
接口的一些定义类。