我在JTree中渲染节点时遇到问题。当节点的字体被更改并且节点的文本以这种方式变宽时,节点的文本被剪切并且文本的末尾被点替换。 那么如何告诉JTree它应该扩大区域来渲染整个节点。
感谢您的帮助
答案 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}}