显示另一个树表中更新的树表值

时间:2011-11-28 03:01:11

标签: java swing swingx jxtreetable

我正在尝试使用场景编辑器来使用我的渲染引擎。我正在使用swing来制作GUI,并使用swingx作为其JXTreeTable组件。一切都运行正常,除了Scene树表没有按照我的意愿自动更新节点的名称。例如,在下一个图像中,我更改了其中一个节点的名称,似乎什么都没发生。但是,如果我将鼠标移到场景框中的节点(顶部的那个)上,则名称会更新。

enter image description here

我有两个JXTreeTable和两个扩展AbstractTreeTableModel的模型。 以下是Properties模型的相关代码。

public class PropertiesModel extends AbstractTreeTableModel{
    private EE_Property root;
    private SceneModel mSceneModel;
    private EE_SceneObject sceneSelection;

    ...

    @Override
    public void setValueAt(Object value, Object node, int column){
        ((EE_Property)node).setValue((String)value);

        // Updates the values of the current scene selection
        sceneSelection.setProperties(root);

        TreePath path = new TreePath(sceneSelection.getParent());
        int index = mSceneModel.getIndexOfChild(sceneSelection.getParent(), sceneSelection);

        // This is where I thought the updating of the scene model would happen and thus redraw it correctly
        mSceneModel.getTreeModelSupport().fireChildChanged(path, index, sceneSelection);
    }
}

我认为使用fireChildChanged()会根据需要更新场景树表。

如果我使用index = 0调用fireChildChanged(),我可以在重命名时让Root节点更新,但是我必须等待任何其他索引,直到我将鼠标移到它上面进行更新。

编辑:问题已解决

我尝试了@Shakedown建议的重绘方法,该方法部分有效,但如果新文本比原始文本长,有时会在文本后面留下“......”。

但我确实知道问题来自TreePath没有正确生成。使用TreePath path = new TreePath(sceneSelection.getParent());时,路径的父级为空,因此不允许树更新。我现在使用这个有效的代码:

// mTT is the scene tree table
TreePath nodePath = mSceneModel.mTT.getTreeSelectionModel().getSelectionPath(); 
int index = mSceneModel.getIndexOfChild(sceneSelection.getParent(), sceneSelection);
mSceneModel.getTreeModelSupport().fireChildChanged(nodePath.getParentPath(), index, sceneSelection);

1 个答案:

答案 0 :(得分:3)

您正在通知听众SceneModel哪个不是您要更新的树表。在fireXXX类上查找一些类似的AbstractTreeTableModel方法并调用它们,这些方法将通知JXTreeTable并且它将自行重绘。

看起来你想要的是fireTreeNodesChanged(...),所以要玩弄它并找出你需要传递的参数。