【问题标题】:Swing JTree icon renderingSwing JTree 图标渲染
【发布时间】:2011-04-28 14:26:40
【问题描述】:

我想在我的 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,将叶节点添加到正确的位置。在进行这些更改后调用 repaint。包含的 JScrollPane 类被包装到一个 JSplitPane 中,该 JSplitPane 被渲染到框架中。

【问题讨论】:

  • 如果不看代码就很难跟踪这些 - BasicTreeUI 做了很多大小缓存,但在适当的时候并不总是被清除。加上一些 LAF 默默地安装了一个固定的 rowHeight,这会破坏问题。

标签: java swing icons rendering jtree


【解决方案1】:

这对我来说很好。仔细检查没有其他事情发生。

如果您在树显示后更改此设置,请确保您正在重新绘制树。

一个丑陋的解决方法可能是一个 100% 透明的图标而不是 null。

【讨论】:

  • 所有这些配置都是在树显示之前完成的。我想这可能是我使用的 L&F 的问题。
  • 另外,基于EDT; JTree 对此特别敏感。
【解决方案2】:

另一种方法是使用没有像素的实现,正如here 建议的那样。

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多