Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502

    [Java] JTree selezionare un TreePath

    Ciao,
    ho un JTree che cambia a run-time.
    Quando si aggiunge un nodo invoco:
    codice:
    treeModel.reload();
    per far visualizzare i nodi aggiunti.
    Quando lo invoco, l'albero mi risulta compresso con solo il root visibile.

    Vorrei che l'ultimo pah selezionato, se ancora presente, venga espanso e selezionato.
    Ho provato a fare:
    codice:
    oldTreePath=tree.getSelectionPath();
    // aggiungo o tolgo i nodi
    ...
    treeModel.reload();
    tree.expandPath(oldTreePath);
    tree.setSelectionPath(oldTreePath);
    Solo che non mi espande il nodo relativo al path e manco me lo seleziona.
    Come fare?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Mi autorispondo.
    Rifacendo da zero il JTree con il reload del modello, il TreePath precedente salvato in una variabile non esiste più, poichè con il reload crea dei nuovi oggetti.
    Ho risolto salvando il path come lista di stringhe e poi percorrendo il JTree alla ricerca della stessa sequenza.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Rubox
    Mi autorispondo.
    Rifacendo da zero il JTree con il reload del modello, il TreePath precedente salvato in una variabile non esiste più, poichè con il reload crea dei nuovi oggetti.
    Di quali "nuovi" oggetti stai parlando??? Il TreePath resta comunque ancora valido!!!

    E questo infatti funziona:

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    
    public class TestFrame extends JFrame {
        private JTree tree;
        private DefaultTreeModel model;
    
        public TestFrame() {
            super("Test JTree Add");
    
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(400, 300);
    
            tree = new JTree();
            model = (DefaultTreeModel) tree.getModel();
    
            JButton addButton = new JButton("ADD");
    
            getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
            getContentPane().add(addButton, BorderLayout.SOUTH);
    
            addButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    TreePath selPath = tree.getSelectionPath();
    
                    if (selPath != null) {
                        DefaultMutableTreeNode node = (DefaultMutableTreeNode) selPath.getLastPathComponent();
    
                        DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("hello");
                        node.add(newNode);
    
                        model.reload(node);
    
                        tree.expandPath(selPath);
                        tree.setSelectionPath(selPath);
                    }
                }
            });
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new TestFrame().setVisible(true);
                }
            });
        }
    }
    E nota che non chiude il resto!!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Riproverò con il tuo codice.
    Mi sono spiegato male prima. Non faccio add per il nodo.
    Ma lo ricreo da zero, quindi passo un nuovo root, e poi via via con insertNodeInto popolo il JTree.

    Avevo trovato un link gugolando che spiegava che ogni volta che si ricrea un JTree in questo modo, cambia il TreePath. Io avevo inteso che quindi il TreePath salvato prima non fosse più un oggetto valido del JTree, inteso male mi sa :-)

    OK. Non mi autorispondo più

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Rubox
    Ma lo ricreo da zero, quindi passo un nuovo root

    ogni volta che si ricrea un JTree in questo modo, cambia il TreePath.
    Ah beh, così certo che il TreePath non è più valido! .... radi tutto a zero!!!
    (non avevo interpretato bene le tue parole).

    Comunque perché dovresti rifare tutto?? Vuoi aggiungere un nuovo nodo in un nodo X già esistente? Allora usa l'add() come nel mio esempio e fai il reload solo dal nodo X!! Così è più semplice, non chiude altri nodi espansi e non perdi il TreePath!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Originariamente inviato da andbin
    Ah beh, così certo che il TreePath non è più valido! .... radi tutto a zero!!!
    (non avevo interpretato bene le tue parole).
    Non mi ero spiegato bene. "Rado" tutto a zero.


    Originariamente inviato da andbin
    Comunque perché dovresti rifare tutto?? Vuoi aggiungere un nuovo nodo in un nodo X già esistente? Allora usa l'add() come nel mio esempio e fai il reload solo dal nodo X!! Così è più semplice, non chiude altri nodi espansi e non perdi il TreePath!
    Il JTree mi serve per visualizzare delle schede di dati di un certo oggetto.
    Il nome dell'oggetto è la "foglia" dell'albero. Poiché posso anche cambiare il nome dell'oggetto e quindi del nodo del JTree, scrivo le modifiche sul database di supporto per i dati, e poi rieseguo le query per popolare nuovamente il JTree.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.