gpt4 book ai didi

java - 物质中的 JTree 连接线

转载 作者:行者123 更新时间:2023-11-30 07:39:18 28 4
gpt4 key购买 nike

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

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

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

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

最佳答案

全靠内存。如果我明天发现任何问题,我会进行编辑。

查看 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
}

关于java - 物质中的 JTree 连接线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/837505/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com