JTree节点的渲染和字体更改

时间:2011-02-10 08:10:23

标签: java swing rendering jtree

我在JTree中渲染节点时遇到问题。当节点的字体被更改并且节点的文本以这种方式变宽时,节点的文本被剪切并且文本的末尾被点替换。 那么如何告诉JTree它应该扩大区域来渲染整个节点。

感谢您的帮助

4 个答案:

答案 0 :(得分:3)

您可以使用自定义渲染器并将其设置为此类组件(JLabel)

final Dimension size = label.getPreferredSize(); 
label.setMinimumSize(size); 
label.setPreferredSize(size);

或只是设置这样的文字

setText("<html>" +valueText+"</html>")

答案 1 :(得分:0)

听起来字体更改的触发器发生在树的脚下:在内部,ui委托执行大量的大小缓存,必须在影响缓存大小的任何更改上更新。这是在对treeModel的更改,相关的扩展状态以及树本身的一些可视更改时自动完成的。

所以基本的问题是:是什么触发了字体的变化?如果它是模型/节点的一些变化,模型实现在不触发适当的TreeModelEvent时是不正确的,显而易见的解决方案是修复:-)如果它是模型之外的东西,解决方案取决于您的上下文的细节,没有普遍适用。

答案 2 :(得分:0)

大小缓存

JTree使用renderer来渲染节点。 renderer与所有操作系统的渲染器相同,因此不同的外观位于ComponentUIs内。 JTree默认使用JLabel绘制节点,因此JLabel的大小指导我们使用...剪切文本。

让我们简单介绍一下:Swing对于不同的操作系统有不同的LookAndFeel,它们与UI类中的组件分离,如BasicLabelUI(这是你的问题的根源)。 BasicLabelUI缓存标签的大小,以防止在未进行任何更改时重新计算。所以BasicLabelUI没有清除theese旧尺寸值的缓存。如果他了解任何更改,BasicLabelUI会清除缓存。

问题是,为什么BasicLabelUI没有得到有关变化的信息?好吧,如果以编程方式修改/扩展/重命名树,则必须告诉ComponentUI删除该缓存!

你很幸运,你不需要写很多代码,因为天才已经为你写了一些东西,TreeUI级别的创建者 Rob Davis Scott Violet 写道startEditingAtPath和stopEditing。

实施例

TreeUI ui = tree.getUI();
for (TreePath treePath : selectionPaths) {
    ui.startEditingAtPath(tree, treePath);
}
tree.setSelectionPaths(selectionPaths);
tree.expandPath(expandPaths.getSelectionPath());
ui.stopEditing(layer);

答案 3 :(得分:-1)

致电TreeModel的{​​{1}}