3

我正在尝试制作一个场景编辑器来配合我的渲染引擎。我正在使用 swing 来制作 GUI,还使用 ​​swingx 来制作它的JXTreeTable组件。一切正常,除了场景树表没有按照我的意愿自动更新节点的名称。例如,在下一张图片中,我更改了其中一个节点的名称,但似乎没有任何反应。但是,如果我将鼠标移到场景框中的节点(顶部的那个)上,名称就会更新。

在此处输入图像描述

我有两个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);
    }
}

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

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

编辑:问题已解决

我尝试了@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);
4

1 回答 1

3

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

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

于 2011-11-28T03:06:00.050 回答