我想在我的 swing 应用程序中有一个没有叶节点图标的 JTree,所以我编写了以下代码:
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)
jtree.getCellRenderer();
renderer.setLeafIcon(null);
jtree.setCellRenderer(renderer);
这正确地删除了叶子的图标,但它也会导致以下呈现错误:
您可以看到附加到分支节点的标签被截断了,并且它们靠得太近了。如果我展开然后折叠所有分支节点,问题就会自行解决:
如果我注释掉这一行:
renderer.setLeafIcon(null);
问题消失了(但出现了我不想要的叶子图标。)
有什么办法解决这个问题吗?
编辑:我将添加所有相关代码。
public class StepChooserPanel extends JScrollPane {
private JTree rules;
public StepChooserPanel(TabPanel parent){
super();
this.setBackground(Color.white);
DefaultMutableTreeNode top = new DefaultMutableTreeNode("top");
rules = new JTree();
rules.getSelectionModel()
.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
rules.setRootVisible(false);
rules.setScrollsOnExpand(false);
rules.setToggleClickCount(1);
rules.addTreeSelectionListener(parent);
rules.putClientProperty("JTree.lineStyle", "None");
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)
rules.getCellRenderer();
renderer.setLeafIcon(null);
rules.setCellRenderer(renderer);
this.setViewportView(rules);
}
public void populateFilterRules(InferenceSystem system){
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
TreeModel treeModel = new DefaultTreeModel(root);
rules.setModel(treeModel);
List<Rule> systemRules = system.getSortedRules();
for(int i = 0; i < systemRules.size(); i++){
if(!(systemRules.get(i) instanceof InferenceRule)){
continue;
}
DefaultMutableTreeNode rule = new DefaultMutableTreeNode
(systemRules.get(i).getName());
root.add(rule);
}
rules.expandPath(new TreePath(root.getPath()));
this.repaint();
}
public void populateRewriteList(Collection<Rewrite> choices){
DefaultMutableTreeNode root = (DefaultMutableTreeNode) rules.getModel()
.getRoot();
for(Rewrite rr : choices){
for (int i = 0; i < root.getChildCount(); i++){
String ruleName = (String) ((DefaultMutableTreeNode)root.getChildAt(i))
.getUserObject();
if(rr.getRule().getName().equals(ruleName)){
((DefaultMutableTreeNode)root.getChildAt(i))
.add(new DefaultMutableTreeNode(rr));
}
}
}
this.repaint();
}
所有设置都在构造函数中完成。调用 populateFilterRules,添加分支节点。然后调用 populateRewriteList,将叶节点添加到正确的位置。进行这些更改后将调用重绘。包含的 JScrollPane 类被包装到 JSplitPane 中,它被渲染到框架中。
最佳答案
这对我来说很好用。仔细检查没有其他事情发生。
如果您在显示树后更改它,请确保您正在重新绘制树。
丑陋的解决方法可能是 100% 透明的图标而不是 null。
关于java - Swing JTree图标渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5820173/