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