JTree соединительные линии в веществе - PullRequest
2 голосов
/ 08 мая 2009

При использовании новой версии сущности для Java, соединительные линии в типичном JTree не рисуются (линии родитель - потомок).

На официальном форуме в java.net кто-то спросил то же самое , и ответ разработчика за это состоит в том, что это был выбор, основанный на более новых пользовательских интерфейсах, и не планируется реализовывать опцию в будущем.

В его ответе также говорилось, что вы можете реализовать это самостоятельно, создав подкласс класса SubstanceUI и реализуя методы paintHorizontPartOfLeg / paintVerticalPartOfLeg.

Может ли кто-нибудь объяснить необходимый процесс или, может быть, привести мне пример? Я уверен, что кто-то, должно быть, сделал это, так как от имени разработчика это очень странный выбор - не рисовать эти линии.

1 Ответ

4 голосов
/ 08 мая 2009

Это все идет по памяти. Я отредактирую, если завтра у меня что-то не так.

проверить BasicTreeUI или MetalTreeUI. Я считаю, что они оба рисуют линии.

Что вам нужно сделать, это создать новый класс, который расширяет (я думаю, по названию здесь) SubstanceTreeUI и переопределяет paintHor horizontalPartOfLeg () и paintVerticalPartOfLeg (). Тогда у вас есть выбор:

  1. Вы можете вызвать myTree.setUI (новый MyTreeUI ())
  2. UIManager.getDefaults (). Put ("TreeUI", MyTreeUI.class.getName ()) в какой-то момент перед тем, как вы создадите JTree

Если вы не хотите создавать подклассы, попробуйте UIManager.getDefaults (). Put ("TreeUI", BasicTreeUI.class.getName ()) и посмотрите, выглядит ли это нормально.

РЕДАКТИРОВАТЬ 2: После дальнейшего просмотра было бы проще просто вызвать .setUI (new BasicTreeUI ()) на вашем JTree или вызвать UIManager.getDefaults (). Put ("TreeUI", BasicTreeUI.class.getName ()) перед созданием вашего дерева. *

EDIT:
SubstanceTreeUI - это класс BasicTreeUI. Он переопределил paintXXXPartOfLeg ().

Horiz:

@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, или попробуйте этот ОЧЕНЬ грубый взлом (см. Ниже):

Вы также можете вырезать и вставить код из методов paintXXXPartOfLeg BasicTreeUI в подкласс.

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
}
...