我在JTree
中使用自定义模型。当某个节点的标签发生变化时,我会通过以下方式将TreeModelEvent
传递给侦听器:
protected void fireNodeChanged(TreePath path) {
TreeModelEvent evt = new TreeModelEvent(this, path);
for(TreeModelListener listener : listeners) {
listener.treeNodesChanged(evt);
}
}
其中path
是更改节点的路径,包括其自身。
这导致标题更改,但它的大小不会:
Swing截断标题并添加省略号(用红色箭头指向)。
如何解决这个问题?请注意,我有自定义模型,无法调用nodeChanged
,我应该模仿它。
答案 0 :(得分:0)
如果没有一个片段,可以做几个猜测,但这种情况对我来说似乎很熟悉。
尝试向渲染组件执行JTree
的{{1}}添加渲染器,然后再将其渲染:
updateUI()
关于更新,如果"模拟"意味着实现它并做了应该做的事情,这是正确的。只要它实现了tree.setCellRenderer(new DefaultTreeRenderer() {
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component c = super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
// You can do more changes here
((JComponent) c).updateUI();
return c;
}});
并且方法做了所谓的,TreeModel
应该完成其余的工作。
截断可能与树和表没有放置"组件的事实有关。但是请使用渲染器将它们涂在伪造的容器中。
顺便说一句,您可以查看EventListenerList
以获取适当的事件监听器集合。
答案 1 :(得分:0)
您是否在自定义TreeModel实现中实现了addTreeModelListener(TreeModelListener l)
?修改节点时,您需要在任何已注册的侦听器上调用treeNodesChanged(TreeModelEvent e)
。查看DefaultTreeModel
的源代码示例(通知通过节点的父节点向上传播)。或者,只需让您的自定义模型扩展DefaultTreeModel
并节省一些时间重新实现所有侦听器的内容。