如何使用自定义模型更新树节点大小?

时间:2014-09-23 19:48:47

标签: java swing jtree

我在JTree中使用自定义模型。当某个节点的标签发生变化时,我会通过以下方式将TreeModelEvent传递给侦听器:

       protected void fireNodeChanged(TreePath path) {
            TreeModelEvent evt = new TreeModelEvent(this, path);
            for(TreeModelListener listener : listeners) {
                listener.treeNodesChanged(evt);
            }
        }

其中path是更改节点的路径,包括其自身。

这导致标题更改,但它的大小不会:

enter image description here

Swing截断标题并添加省略号(用红色箭头指向)。

如何解决这个问题?请注意,我有自定义模型,无法调用nodeChanged,我应该模仿它。

2 个答案:

答案 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并节省一些时间重新实现所有侦听器的内容。

相关问题