Treeview состояние свернутых / развернутых элементов после операции javafx

У меня проблема с элементом управления TreeView в JavaFX. Когда я делаю какую-то операцию (например, добавляю новый элемент). Шаги:

  1. У меня есть некоторые элементы treeView расширены
  2. Я использую contextMenu, чтобы добавить новый элемент в указанный узел
  3. Товар добавлен в мою структуру (серверная часть)
  4. TreeView перезагружается - отображается сначала (только root)

Я хочу видеть свой TreeView, как перед добавлением элемента (эти же элементы свернуты и развернуты). Понятия не имею, как это сделать. Я думал об изменении реализации StructureNode (добавить логическое поле isExpanded и использовать его, но это не сработает - я открываю свой TreeView из файла, где нет информации о нем). Есть ли у вас предложения?

Если вы просто изменяете данные серверной части и просто добавляете один элемент, зачем вообще перезагружать данные? Похоже, ваша проблема будет решена, если вы просто добавите TreeItem после успешного обновления серверной части. Но если вам нужно перезагрузить данные, вы можете просто создать Map<ItemKey, Boolean> для хранения информации и восстановить ее для новой структуры TreeItem ...

fabian 11.04.2018 14:15

Также обратите внимание, что вы теряете не только развернутое состояние, перезагружая все дерево; вы также теряете выделение, позицию (позиции) прокрутки и т. д. и т. д. Как предлагает фабиан, гораздо лучший подход - просто изменить существующую иерархию дерева (т.е. добавить TreeItem к соответствующему родительскому элементу, если элемент добавлен в бэкэнд и т. д. .) и избегайте перезагрузки всей конструкции.

James_D 11.04.2018 15:09

@fabian @James_D Я прислушиваюсь к вашим комментариям и одновременно выполняю «удаление элемента» из бэкэнда и TreeView. Работает хорошо. Мое решение состоит в том, что у меня есть элемент, который будет удален sctructureNode.getId(), и мне нужно выполнить рекурсивный поиск в TreeView для этого элемента boolean search(TreeItem<StructureNode> root, int id){ for(TreeItem<StructureNode> c: root.getChildren()){ if(c.getValue().getId() == id){c.getParent().getChildren().remove(c); return true;} else {searchTreeView(c, id);}} return false;}. Это хороший подход или я должен что-то изменить?

materaldo 12.04.2018 13:39
1
3
849
1

Ответы 1

Поскольку вы не используете систему редактирования ячеек непосредственно в экземпляре раздела меню, вы должны перезагрузить дерево из корня, чтобы отобразить добавленную новую созданную ячейку. Вы можете использовать массив, такой как byte [] (элемент для каждого TreeView), вы можете сохранить 1 или 0, чтобы пометить состояние просмотра для каждого уровня дерева, например, 1 = отображается 0 = закрыто и, возможно, если потребуется, отдельная переменная для "корневого" байта rootState = 0; или 1 в зависимости от того, отображается ли дерево. Когда вы помещаете в него новый элемент через серверную часть, вы затем устанавливаете состояния древовидного представления, как показано в вашем массиве памяти, аналогично следующему коду при его перезагрузке. например

byte rootState=1B;
byte[] subTreeViewStates = {1B,1B,0B,1B,0B};
TreeView[] subTreeViews={number1treeView,number2treeView,number3treeView,number4treeView,number5treeView};
if((new Byte(rootState).intValue())==1){
    root.setExpanded(true); // expands that TreeView node
}else{
    root.setExpanded(false); // collapses  that TreeView node
}
for(int mnu=0; (mnu < subTreeViews.length) ; mnu++){
if((new Byte(subTreeViews[mnu]).intValue()) == 1)
subTreeViews[mnu].setExpanded(true); // expands that TreeView node
}else{
subTreeViews[mnu].setExpanded(true); // collapses  that TreeView node
}
}// end for

и методы для установки памяти состояний просмотра на повторное отображение

// int status is fed as either 1 or 0
byte setTreeviewsstatus(int menu,int status){
subTreeViewStates[menu]=new Integer(status).byteValue();
return subTreeViewStates[menu];
} // end method

byte rootState(int state){
rootState=new Integer(state).byteValue();
return rootState;
} // end method

после добавления TreeView его более легкая задача - повторить массив «subTreeViews» для объектов TreeView вспомогательных представлений

byte[] addLevelsubtree(){
int subtrees = subTreeViewStates.length + 1;
subTreeViewStates 
byte[] st = new byte[subtrees];
// copy process memory storage states to temporary local array st
for(int rdo = 0; rdo < subtrees; rdo++){
if(rdo < (subtrees-1)){
st[rdo]=subTreeViewStates[rdo];
}else{
st[rdo]=0B; // collapsed hidden
}
// recopy to reinstantiated original process view state storage array
subTreeViewStates=new Byte[subtrees];
for(int rdo2 = 0; rdo2 < subtrees; rdo2++){
subTreeViewStates[rdo2]=st[rdo2];
} // end for
return subTreeViewStates;
} // end method



TreeView[] addLevelTreeVieObj(TreeView viewtreee){
int trvw = subTreeViews.length + 1;
TreeView[] tv = new TreeView[trvw];
for(int mmx=0; mmx < (trvw-1); mmx++){
tv[mmx] = subTreeViews[mmx]; 
}
tv[(trvw-1)] = viewtreee; // add last new TreeView object element reference
//
subTreeViews = new TreeView[trvw]; // reconstruct original array larger
for(int mmxb=0; mmxb < trvw; mmxb++){
subTreeViews[mmxb] = tv[mmxb]; 
}
return subTreeViews;
} // end method

Спасибо за ответ, но сначала я проверю комментарии, добавленные к моему сообщению. Если это не поможет, я проверю ваше решение. Хорошего дня

materaldo 12.04.2018 13:43

Другие вопросы по теме