powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JTree сохранение развернутых узлов и восстановление...
3 сообщений из 3, страница 1 из 1
JTree сохранение развернутых узлов и восстановление...
    #33355294
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.
Столкнулся с такой проблемой, что надо сохранять все развернутые узлы дерева, чтобы при следующем открытии панели (фрейма и т.д.) восстанавливать состояния этих узлов в развернутое.

Сохранение делаю в отдельной функции так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
     public   void  saveJustments(){
        java.util.Properties pr= new  java.util.Properties();
        pr.setProperty("Handbook panel-divider location", String.valueOf(SplitPane.getDividerLocation()));
        //Вот здесь получаю строку со всеми развернутыми узлами
        pr.setProperty("Handbooks tree-expanded nodes", getExpandedNodes());
         try {
            pr.storeToXML( new  java.io.FileOutputStream("Handbookspanel.xml"), "Handbooks panel");
        } catch (java.io.IOException ioe){
            javax.swing.JOptionPane.showMessageDialog( null , "Cannot save justments", "Warning", javax.swing.JOptionPane.WARNING_MESSAGE);
        }
    }
//А вот функция получения всех развернутых узлов
     private  String getExpandedNodes(){
        String ret="";
        javax.swing.tree.DefaultTreeModel dtm = (javax.swing.tree.DefaultTreeModel)HandbooksTree.getModel();
        javax.swing.tree.TreePath tp_root= new  javax.swing.tree.TreePath(dtm.getRoot());
        java.util.Enumeration e=HandbooksTree.getExpandedDescendants(tp_root);
         for (;e.hasMoreElements();){
            ret=ret+e.nextElement()+";";
        }
         return  ret;
    }

Сохраняется примерное в таком виде:
<entry key="Handbooks tree-expanded nodes">[Справочники, Общие, Расстояния];[Справочники, Общие];[Справочники];[Справочники, Бухгалтерские];</entry>

Как бы с сохранением понятно.
А вот с восстановлением вообще не понятно. Дело в том, что назад я получаю строку, которую разбиваю на отдельные пути:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        java.util.StringTokenizer st= new  java.util.StringTokenizer(exp, ";");
         for (;st.hasMoreElements();){
            String element=()st.nextElement();
            element=element.replace("[", "");
            element=element.replace("]", "");
            javax.swing.tree.TreePath tp= new  javax.swing.tree.TreePath(element);
             try {
                HandbooksTree.expandPath(tp);
            } catch (Exception e){
                //Типа не могу развернуть узел
            }
Но функция HandbooksTree.expandPath(tp) всегда вылетает в исключение, когда работаешь со строками. Хотя дерево заполняется объектами типа String. Пробовал и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        java.util.StringTokenizer st= new  java.util.StringTokenizer(exp, ";");
         for (;st.hasMoreElements();){
             try {
                HandbooksTree.expandPath((javax.swing.tree.TreePath)st.nextElement());
            } catch (Exception e){
                //Типа не могу развернуть узел
            }
Не работает.

Народ, кто знает как делается такая вещь, подскажите, пожалуйста.

С уважением Vector.
...
Рейтинг: 0 / 0
JTree сохранение развернутых узлов и восстановление...
    #33356138
Ros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Try it:
http://www.jayasoft.org/uistate

если можно использование сторонних библиотек, а можно еще через Preferences с 1.4 появились.
...
Рейтинг: 0 / 0
JTree сохранение развернутых узлов и восстановление...
    #33356456
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Ros.
Посмотрел библиотеку, не совсем то, что надо, потому что Manager работает с классом, производным от java.awt.Window, а у меня javax.swing.JPanel, но!
Скачал исходники данной библиотеки, вырезал кусок, относящийся к JTree (соответствующий handler) и приспособил его к своему java.util.Properties - заработало!!!

Огромное спасибо!
Если кому интересно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
    //Stroing - restoring tree
     public   void  store(java.util.Properties properties) {
       javax.swing.tree.TreeModel model = HandbooksTree.getModel();
        storePath(properties, HandbooksTree, model,  new  javax.swing.tree.TreePath(model.getRoot()), "root");        
    }
     private   void  restorePath(java.util.Properties properties, javax.swing.JTree tree, javax.swing.tree.TreeModel model, javax.swing.tree.TreePath path, java.lang.String prefix) {
         boolean  isExpanded =  new  java.lang. Boolean (properties.getProperty(prefix+".exp"));
         if  (isExpanded) {
            tree.expandPath(path);
            Object parent = path.getLastPathComponent();
             int  number = model.getChildCount(parent);
             for  ( int  i= 0 ; i<number; i++) {
                Object child = model.getChild(parent, i);
                restorePath(properties, tree, model, path.pathByAddingChild(child), prefix+"."+i);
            }
        }
    }
     private   void  storePath(java.util.Properties properties, javax.swing.JTree tree, javax.swing.tree.TreeModel model, javax.swing.tree.TreePath path, java.lang.String prefix) {
         boolean  isExpanded = tree.isExpanded(path);
        properties.setProperty(prefix+".exp", String.valueOf(isExpanded));
         if  (isExpanded) {
            Object parent = path.getLastPathComponent();
             int  number = model.getChildCount(parent);
             for  ( int  i= 0 ; i<number; i++) {
                Object child = model.getChild(parent, i);
                storePath(properties, tree, model, path.pathByAddingChild(child), prefix+"."+i);
            }
        }
    }
    //End storing - restoring tree
    
     public   void  loadJustments(){
        java.util.Properties pr= new  java.util.Properties();
         try {
            pr.loadFromXML( new  java.io.FileInputStream("Handbookspanel.xml"));
            //Divider
            String dl=pr.getProperty("Handbook panel-divider location");
             if (dl!= null ) SplitPane.setDividerLocation(Integer.decode(dl));
            restore(pr);
        } catch (java.io.IOException ioe){
            javax.swing.JOptionPane.showMessageDialog( null , "Cannot load justments", "Warning", javax.swing.JOptionPane.WARNING_MESSAGE);
        }
    }
     public   void  saveJustments(){
        java.util.Properties pr= new  java.util.Properties();
        store(pr);
         try {
            pr.storeToXML( new  java.io.FileOutputStream("Handbookspanel.xml"), "Handbooks panel");
        } catch (java.io.IOException ioe){
            javax.swing.JOptionPane.showMessageDialog( null , "Cannot save justments", "Warning", javax.swing.JOptionPane.WARNING_MESSAGE);
        }
    }
С уважением Vector.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JTree сохранение развернутых узлов и восстановление...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]