Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing JTree图标渲染_Java_Swing_Icons_Rendering_Jtree - Fatal编程技术网

Java Swing JTree图标渲染

Java Swing JTree图标渲染,java,swing,icons,rendering,jtree,Java,Swing,Icons,Rendering,Jtree,我希望在swing应用程序中有一个JTree,它没有叶节点图标,因此我编写了以下代码: DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) jtree.getCellRenderer(); renderer.setLeafIcon(null); jtree.setCellRenderer(renderer); 这将正确删除树叶的图标,但也会导致以下渲染错误: 您可以看到,附加到分支节

我希望在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();
}
公共类StepChooserPanel扩展了JScrollPane{
私有JTree规则;
公共单步选择器面板(选项卡面板父级){
超级();
这个.背景(颜色.白色);
DefaultMutableTreeNode top=新的DefaultMutableTreeNode(“top”);
规则=新的JTree();
rules.getSelectionModel()
.setSelectionMode(树选择模型。单树选择);
规则。setRootVisible(false);
rules.setScrollsOnExpand(false);
规则。setToggleClickCount(1);
rules.addTreeSelectionListener(父级);
rules.putClientProperty(“JTree.lineStyle”,“无”);
DefaultTreeCellRenderer=(DefaultTreeCellRenderer)
rules.getCellRenderer();
renderer.setLeafIcon(null);
规则。setCellRenderer(渲染器);
此.setViewportView(规则);
}
公共无效公共过滤规则(推理系统){
DefaultMutableTreeNode根=新的DefaultMutableTreeNode();
TreeModel TreeModel=新的默认TreeModel(根);
rules.setModel(treeModel);
List systemRules=system.getSortedRules();
对于(int i=0;i

所有的设置都在构造函数中完成。调用populateFilterRules,将其添加到分支节点中。然后调用PopulateWriteList,将叶节点添加到正确的位置。在进行这些更改后调用repaint。将包含的JScrollPane类包装到JSplitPane中,并将其呈现到框架中。

对我来说很好。再次检查是否有其他事情发生

如果在树显示后更改此选项,请确保正在重新绘制树


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

另一种方法是使用建议的没有像素的实现。

所有这些配置都是在树显示之前完成的。我想这可能是我使用的L&F的问题。另外,基于;
JTree的构建对这一点特别敏感。这些如果看不到代码,就很难跟踪。BasicTreeUI会进行大量大小缓存,但在适当的时候并不总是清除这些缓存。另外,一些LAF会默默地安装固定的行高,这会导致问题的恶化。