Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > jTree & Update database


Автор: skif18 13.1.2011, 12:47
Есть дерево с моделью данных из базы данных.
Код

     DefaultTreeModel treeModel = new DefaultTreeModel(root);
     jTree= new JXTree(treeModel);

отображается все нормально.
Вопрос : При редактировании, есть ли возможность после закрытия редактирования
Код

 jTree.getCellEditor().stopCellEditing();

делать обновление данных в самой базе данных? Аналог firetablechanged но для дерева? Как народ вообще это организует?

Вот весь текст формирования дерева. Может слегка корявый...
Код

    private JTree getJTree() {
        final JPopupMenu popup;
        JMenuItem mi;
        MouseAdapter ma;
        if (jTree == null) {
            Connection con = null;
              Statement st = null;
              ResultSet rs = null;
            String driver = "org.postgresql.Driver";
            String url = "jdbc:postgresql://localhost:5432/";
            String db = "test";
            try {
                Class.forName(driver);
                 con = DriverManager.getConnection(url + db, "postgres", "syrus");
            } catch (ClassNotFoundException e1) {
                // TODO Автоматически созданный блок catch
                e1.printStackTrace();
            } catch (SQLException e) {
                // TODO Автоматически созданный блок catch
                e.printStackTrace();
            }
            String CurIdFolder=null;
            parent = new DefaultMutableTreeNode("Подразделения");
//            root = parent;
            try {
//              String sql = " SELECT * FROM treepodr Where isfolder=1;";
              st = con.createStatement();
              rs=st.executeQuery(" SELECT * FROM treepodr;");

           createChild(st.executeQuery(" SELECT * FROM treepodr;"),
                 null, 1);
           DefaultTreeModel treeModel = new DefaultTreeModel(root);

           jTree= new JXTree(treeModel);
            } catch (Exception e) {
                  System.out.println(e);
                }  

            jTree.setEditable(true);
            jTree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
            
           final TreePath m_clickedPath = null;
            popup = new JPopupMenu();
            Action action = new AbstractAction() 
            { 
              public void actionPerformed(ActionEvent e)
              {
                if (m_clickedPath==null)
                  return;
                if (jTree.isExpanded(m_clickedPath))
                  jTree.collapsePath(m_clickedPath);
                else
                  jTree.expandPath(m_clickedPath);
              }
            };
            popup.add(action);
            popup.addSeparator();

            Action a1 = new AbstractAction("New Node ") 
            { 
              public void actionPerformed(ActionEvent e)
              {
                                    
                JOptionPane.showMessageDialog( jTree, "New Node"+jTree.getStringAt(m_clickedPath),
                  "Info", JOptionPane.INFORMATION_MESSAGE);
              }
            };
            popup.add(a1);

            Action a2 = new AbstractAction("New Folder") 
            { 
              public void actionPerformed(ActionEvent e)
              {
               String str=jTree.getStringAt(m_clickedPath).toString().trim();
               System.out.println(str);
/*               for (int i = 1; i <= str.length(); i++) {
                   if (str.charAt(i) == '!') {
                       String code = str.substring(0, i).trim();
                       String name = str.substring(i+1,str.length()).trim();
                       System.out.println(code);
                       System.out.println(name);  
                       
                   }
               }
*/               
//                JOptionPane.showMessageDialog(jTree, 
//                  "Change node-"+jTree.getLastSelectedPathComponent(),"Information", JOptionPane.INFORMATION_MESSAGE);
                
              }
            };
            popup.add(a2);
            
            
            if(jTree.isEditable()==true){
                JTextField textField = new JTextField();
                TreeCellEditor editor = new DefaultCellEditor(textField);
                jTree.setCellEditor(editor);
               textField.addKeyListener(new java.awt.event.KeyListener() {

                    public void keyPressed(KeyEvent arg0) {
                        // TODO Автоматически созданная заглушка метода
                        
                    }

                    public void keyReleased(KeyEvent arg0) {
                        // TODO Автоматически созданная заглушка метода
                        System.out.println("Editing"+arg0.getKeyCode());
                        if (arg0.getKeyCode()==KeyEvent.VK_DOWN) {
                            System.out.println("stopEditing");
                            jTree.getCellEditor().stopCellEditing();
                            SwingUtilities.updateComponentTreeUI(jTree);
                            
                        }
                        
                        
                    }

                    public void keyTyped(KeyEvent arg0) {
                        // TODO Автоматически созданная заглушка метода
                        
                    }
                 
                 
                });
                
           
            }
          

          jTree.addMouseListener(new MouseAdapter() {
              public void mouseClicked(MouseEvent em) {
               if(em.getButton() == em.BUTTON3){
                 
                int selRow = jTree.getRowForLocation(em.getX(), em.getY());      
               x =em.getX();
                  y =em.getY();
                  if(selRow != -1) {
                   TreePath path =jTree.getPathForLocation(em.getX(), em.getY());
                   jTree.setSelectionPath(path);
                   popup.show((JXTree)em.getSource(), x, y);
//                   System.out.println("x="+x);
 //                  System.out.println("y="+y);
//                   System.out.println("path="+path);
                  }
            
               }
              }
            });
          
         
        }
        return jTree;
    }

    
  
    
    
     private void createChild(ResultSet r, DefaultMutableTreeNode p,
                             int l) throws Exception {
        DefaultMutableTreeNode parent = p;
        DefaultMutableTreeNode current = null;
        int level = l;
//        System.out.println("----" + r.getRow());
        if (p == null) {
            parent = new DefaultMutableTreeNode("Предприятие");
            root = parent;

            r.next();

            createChild(r, parent, r.getInt("level1"));
        }
        while (!r.isAfterLast()) {
            if (level < r.getInt("level1")) {
                createChild(r, current, r.getInt("level1"));
            } else if (level == r.getInt("level1")) {
                current = new DefaultMutableTreeNode(r.getString("id").trim()+" ! "+r.getString("descr").trim());
                parent.add(current);
                r.next();
            } else {
                return;
            }

        }
    }

Автор: mgarin 13.1.2011, 16:57
Вот 2 варианта прослушивания редактирования элементов в дереве (вероятно, можно извратиться и по другому):
Код
        JTree tree = new JTree ();
        tree.setEditable ( true );

        DefaultCellEditor dtce = new DefaultCellEditor( new JTextField () )
        {
            public boolean stopCellEditing ()
            {
                boolean b = super.stopCellEditing ();
                System.out.println ( "Inner: Editing done" );
                return b;
            }

            public void cancelCellEditing ()
            {
                super.cancelCellEditing ();
                System.out.println ( "Inner: Editing cancelled" );
            }
        };
        dtce.addCellEditorListener ( new CellEditorListener()
        {
            public void editingStopped ( ChangeEvent e )
            {
                System.out.println ( "Listener: Editing done" );
            }

            public void editingCanceled ( ChangeEvent e )
            {
                System.out.println ( "Listener: Editing cancelled" );
            }
        } );
        tree.setCellEditor ( dtce );

А далее уже как надо так и обрабатывайте измененные данные
Хоть в базу, хоть откатывать изменения либо еще что...

Автор: skif18 19.1.2011, 13:25
Код

jTree.getModel().addTreeModelListener(new TreeModelListener(){

                public void treeNodesChanged(TreeModelEvent tme) {
//  здесь уже сам код  ав моем случае Update в базу

}
});


Но можно ли сделать обновлениев базе не запросом, а чтоб автоматичемки как в таблице обновляло данные в базе данных?

Автор: jk1 19.1.2011, 18:29
Цитата

Но можно ли сделать обновлениев базе не запросом, а чтоб автоматичемки как в таблице обновляло данные в базе данных? 


Только средствами ORM, например Hibernate. В этом случае Вы мапите некую коллекцию сущностей, которая служит дереву моделью на таблицу(ы) в базе данных.

Автор: mgarin 20.1.2011, 02:44
Цитата(skif18 @  19.1.2011,  13:25 Найти цитируемый пост)
Но можно ли сделать обновлениев базе не запросом, а чтоб автоматичемки как в таблице обновляло данные в базе данных? 

Ну так если у Вас уже сделано для таблицы - сделайте по аналогии для дерева...
У обоих есть модель, из которых они берут данные и куда они их записывают - без нее никуда.
Сделайте аналогичную модель для дерева.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)