Показать обновленное значение таблицы дерева из другой таблицы дерева - PullRequest
3 голосов
/ 28 ноября 2011

Я пытаюсь создать редактор сцен для моего движка рендеринга. Я использую Swing для создания GUI, а также swingx для его JXTreeTable компонента. Все работает нормально, за исключением того, что таблица дерева сцен не обновляет имена узлов автоматически, как мне бы хотелось. Например, на следующем изображении я меняю имя одного из узлов, и, похоже, ничего не происходит. Однако если я наведу указатель мыши на узел в поле «Сцена» (тот, что вверху), имя будет обновлено.

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, я могу заставить 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 Ответ

3 голосов
/ 28 ноября 2011

Вы уведомляете слушателей о SceneModel, который не является древовидной таблицей, которую вы хотите обновить. Найдите некоторые похожие fireXXX методы в классе AbstractTreeTableModel и вызовите те, которые уведомят JXTreeTable и перерисовают себя.

Похоже, что вы хотите fireTreeNodesChanged(...), так что поиграйте с этим и выясните, какие параметры вам нужно передать.

...