使用Java实质外观的新版本,不会绘制典型JTree中的连接线(父子线)。

在java.net的官方论坛中,有人问same thing,开发人员对此的回答是,这是基于较新UI的选择,并且将来没有计划实现该选项。

他的回答还说,您可以通过子类化SubstanceUI类并实现paintHorizo​​ntalPartOfLeg / paintVerticalPartOfLeg方法来自己实现。

有人可以解释所需的过程,或者可以举个例子吗?我肯定有人一定会这样做,因为对于开发人员而言,这是一个很奇怪的选择,不要画这些线。

最佳答案

这一切都是从内存中进行的。如果明天发现任何问题,我将进行编辑。

查看BasicTreeUI或MetalTreeUI。我相信他们都画线。

您需要做的是创建一个扩展(将在此处猜测名称的)SubstanceTreeUI的新类,并覆盖paintHorizo​​ntalPartOfLeg()和paintVerticalPartOfLeg()。然后您可以选择:


您可以调用myTree.setUI(new MyTreeUI())
在制作JTree之前的某个时刻,UIManager.getDefaults()。put(“ TreeUI”,MyTreeUI.class.getName())


如果您不想继承子类,请尝试UIManager.getDefaults()。put(“ TreeUI”,BasicTreeUI.class.getName()),看看是否可以。

编辑2:
经过进一步检查后,在创建树之前,只需在JTree上调用.setUI(new BasicTreeUI())或调用UIManager.getDefaults()。put(“ TreeUI”,BasicTreeUI.class.getName())会更容易。

编辑:
SubstanceTreeUI是BasicTreeUI的cubclass。它已覆盖paintXXXPartOfLeg()。

霍里兹:

@Override
protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds,
        Insets insets, Rectangle bounds, TreePath path, int row,
        boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) {
    boolean toPaint = (!this.tree.isEnabled())
            || this.isInside
            || !FadeConfigurationManager.getInstance().fadeAllowed(
                    SubstanceLookAndFeel.TREE_DECORATIONS_ANIMATION_KIND,
                    tree);
    if (FadeTracker.getInstance().isTracked(this.tree, SubstanceLookAndFeel.TREE_DECORATIONS_ANIMATION_KIND)) {
        Graphics2D graphics = (Graphics2D) g.create();
        graphics.setComposite(TransitionLayout
                .getAlphaComposite(this.tree,
                        FadeTracker.getInstance()
                            .getFade10(this.tree,SubstanceLookAndFeel.TREE_DECORATIONS_ANIMATION_KIND) / 10.0f,
                            g));
        super.paintHorizontalPartOfLeg(graphics, clipBounds, insets,
                bounds, path, row, isExpanded, hasBeenExpanded, isLeaf);
        graphics.dispose();
    } else if (toPaint) {
        super.paintHorizontalPartOfLeg(g, clipBounds, insets, bounds, path,
                row, isExpanded, hasBeenExpanded, isLeaf);
    }
}


看起来只有在满足以下两个条件之一时才绘制线条:


未启用树,鼠标处于树边界[this.inside]中,树[!FadeConfigurationManager.getInstance()。fadeAllowed(...)上不允许褪色(?)
FadeTracker跟踪JTree [FadeTracker.getInstance()。isTracked(...)]


找出如何确保FadeTracker跟踪JTree的方法,或尝试这种非常粗糙的技巧(请参见下文):

您还可以将BasicTreeUI的paintXXXPartOfLeg方法中的代码剪切并粘贴到子类中。

public MyTree extends JTree {
    private boolean overrideIsEnable = false;
    public void setOverrideIsEnable(boolean b) { overrideIsEnabeld=true; }
    public boolean isOverrideIsEnable(boolean b) { return overrideIsEnabeld; }
    public boolean isEnabled() {
        if(overrideIsEnabled) return false;
        return super.isEnabled();
    }
}


class MyTreeUI extends SubstanceTreeUI {
protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds,
        Insets insets, Rectangle bounds, TreePath path, int row,
        boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) {
if(this.tree instanceof MyTree)
try {
   Field f = SubstanceTreeUI.class.getDeclaredField("inside");
   f.setAccessible(true);
   Boolean v = (Boolean)f.get(this);
   f.set(this,Boolean.true);
   ((MyTree)this.tree).setOverrideIsEnable(true);
} catch(Throwable t) {
   //want to default back to substanceUI if this fails.
}
super.paintHoriz.....();
try{
    f.set(this,v);
    ((MyTree)this.tree).setOverrideIsEnable(true);
}catch(Throwable t) {
   //see above
}
}
//repeat for Vertical
}

07-24 09:32