我正在尝试使用场景编辑器来使用我的渲染引擎。我正在使用swing来制作GUI,并使用swingx作为其JXTreeTable
组件。一切都运行正常,除了Scene树表没有按照我的意愿自动更新节点的名称。例如,在下一个图像中,我更改了其中一个节点的名称,似乎什么都没发生。但是,如果我将鼠标移到场景框中的节点(顶部的那个)上,则名称会更新。
我有两个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);
答案 0 :(得分:3)
您正在通知听众SceneModel
哪个不是您要更新的树表。在fireXXX
类上查找一些类似的AbstractTreeTableModel
方法并调用它们,这些方法将通知JXTreeTable
并且它将自行重绘。
看起来你想要的是fireTreeNodesChanged(...)
,所以要玩弄它并找出你需要传递的参数。