Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JTree сохранение развернутых узлов и восстановление... / 3 сообщений из 3, страница 1 из 1
01.11.2005, 14:13
    #33355294
Vector
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTree сохранение развернутых узлов и восстановление...
Привет всем.
Столкнулся с такой проблемой, что надо сохранять все развернутые узлы дерева, чтобы при следующем открытии панели (фрейма и т.д.) восстанавливать состояния этих узлов в развернутое.

Сохранение делаю в отдельной функции так:
Код: 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
01.11.2005, 18:51
    #33356138
Ros
Ros
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTree сохранение развернутых узлов и восстановление...
Try it:
http://www.jayasoft.org/uistate

если можно использование сторонних библиотек, а можно еще через Preferences с 1.4 появились.
...
Рейтинг: 0 / 0
02.11.2005, 06:49
    #33356456
Vector
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTree сохранение развернутых узлов и восстановление...
Спасибо 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
Форумы / Java [игнор отключен] [закрыт для гостей] / JTree сохранение развернутых узлов и восстановление... / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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