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

问题描述:

我想使我的渲染引擎进行场景编辑。我正在使用swing来制作GUI,并为其JXTreeTable组件提供swingx。一切工作正常,除了场景树表不会自动更新节点的名称。例如,在下一张图片中,我更改了其中一个节点的名称,似乎什么都没有发生。但是,如果我然后将鼠标移动到场景框(顶部的那个)中的节点上,名称会更新。从另一个树表显示更新的树表值

enter image description here

我有两个JXTreeTable,以及两种机型延伸AbstractTreeTableModel。 以下是属性模型的相关代码。

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()会更新场景树表,因为我想。

如果我调用fireChildChanged()索引= 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); 
+0

高兴你找到了解决办法 - 只是要小心:这味道有点,因为它要求手动从模型本身的_outside_发起更改。 sceneModel应该自己检测包含对象属性的变化 – kleopatra

+0

是的,我意识到我在看着@ Shakedown的评论后以错误的方式做了这件事。但它仍然允许我运行一些东西,现在我可以检查我未来的“正确实施”是否按我期望的方式工作。 – NickLH

你通知SceneModel这是不是要更新树表的听众。在AbstractTreeTableModel类中寻找一些类似的fireXXX方法并调用这些方法,它们将通知JXTreeTable并且它将重绘本身。

它看起来像你想的是fireTreeNodesChanged(...)的一个,所以玩的是,弄清参数需要通过

+0

我确实想更新SceneModel的侦听器,因为这是屏幕顶部的表格......也许我不了解你在说什么,但我认为这正是我所做的。我的PropertiesModel类拥有对我的SceneModel类(mSceneModel)的引用。因为我正在调用mSceneModel上的fireChildChanged,不应该这样做我想要的吗? – NickLH

+0

那它取决于树表正在使用哪个模型。我假设它实际上是一个'PropertiesModel'的实例,在这种情况下,树表将添加侦听器到该对象,而不是'SceneModel'对象。 –

+0

顶层JXTreeTable使用SceneModel,底层JXTreeTable使用PropertiesModel。由于我改变了PropertiesModel中的值(即我在底部树表中编辑了一些东西),我需要以某种方式更新SceneModel,以便顶部树表得到更新,这正是我认为我正在做的。 – NickLH