【问题标题】:JTree connecting lines in SubstanceSubstance 中的 JTree 连接线
【发布时间】:2009-05-07 23:10:44
【问题描述】:

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

在 java.net 的官方论坛中,有人询问了same thing,开发者的回答是,这是基于较新 UI 的选择,并且没有计划在未来实施该选项。

他的回答还说,您可以通过继承 SubstanceUI 类并实现 paintHorizo​​ntalPartOfLeg / paintVerticalPartOfLeg 方法自己实现这一点。

有人可以解释所需的过程或给我一个例子吗?我确信一定有人这样做了,因为代表开发人员选择不画这些线是一个非常奇怪的选择。

【问题讨论】:

    标签: java swing look-and-feel


    【解决方案1】:

    这一切都来自记忆。如果我明天发现有任何问题,我会编辑。

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

    您需要做的是创建一个新类,该类扩展(我猜这里的名称)SubstanceTreeUI 并覆盖paintHorizo​​ntalPartOfLeg() 和paintVerticalPartOfLeg()。那么你有一个选择:

    1. 你可以调用 myTree.setUI(new MyTreeUI())
    2. UIManager.getDefaults().put("TreeUI", MyTreeUI.class.getName() ) 在创建 JTree 之前的某个时间点

    如果您不想子类化,请尝试 UIManager.getDefaults().put("TreeUI", BasicTreeUI.class.getName() ) 看看是否可行。

    编辑 2: 在进一步审查之后,在您的 JTree 上调用 .setUI(new BasicTreeUI()) 或在创建树之前调用 UIManager.getDefaults().put("TreeUI", BasicTreeUI.class.getName() ) 会更容易。

    编辑:
    SubstanceTreeUI 是 BasicTreeUI 的子类。它已经覆盖了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(...)]

    弄清楚如何确保 JTree 被 FadeTracker 跟踪或尝试这个非常粗略的 hack(见下文):

    您还可以将 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
    }
    

    【讨论】:

    • 感谢您的回答。我真正感兴趣的是,一旦我子类化并实现这些方法,我究竟如何画线。 (请注意,substanceUI 类没有这些方法。它不是 BasicUI 的后代)。能否给我一个小例子或指出我可以找到信息的方向?
    • 请看我编辑的答案。仅供参考你不想看 SubstanceUI,你想看 SubstanceTreeUI,它(根据谷歌)有两种方法。
    • 非常感谢。你的答案是当场的。很有帮助。
    • 哪一个?我概述了几个。我只是对您尝试过的以及您最喜欢的感兴趣。
    • 对于在这个答案中搜索过的其他任何人: UIManager.getDefaults().put("TreeUI", BasicTreeUI.class.getName() );使用 Substance 对我来说非常有效(记得在创建 JTree 之前将其放置)。但是,这是为我的每个 JTree 节点使用自定义图标(我不确定它会是什么样子)。谢谢!
    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2011-10-12
    相关资源
    最近更新 更多