我正在尝试制作一个场景编辑器来配合我的渲染引擎。我正在使用 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);