Domanda

Sto avendo un po 'di fastidio capire perché non riesco a ottenere un ascoltatore TreeModelChanged per rispondere ai cambiamenti del modello che si sottoscrive.

Sono riuscito a riprodurre il problema in un piccolo esempio.

Il messaggio SYSOUT non stampa alla console ogni volta che si aggiunge un nuovo nodo per l'albero.

Ho intenzione di sostituire il messaggio sysout con alcuni comandi per ridisegnare l'albero. Al momento sto utilizzando un messaggio SYSOUT solo per dimostrare che l'ascoltatore non viene licenziato.

mi sto perdendo qualcosa di fondamentale?

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;


public class TreeTest {

    private JTree t;
    private DefaultTreeModel m ;

    public static void main(String[] args) {
         new TreeTest();

    }

    public TreeTest() {

        //Draw Frame & Panel  - set dimensions
        JFrame f = new JFrame();
        f.setSize(new Dimension(800,600));
        JPanel p = new JPanel();
        p.setSize(new Dimension(800,600));



        //Create a Tree Model. Give it a String at the root.
        m = new DefaultTreeModel(new DefaultMutableTreeNode("Root"));

        //Create a tree and add the Model to it
        t = new JTree();
        t.setModel(m);


        //Try a Tree Model Listener
        m.addTreeModelListener(new TreeModelListener() {

            private void doSomething() {
                //Should fire whenever a node is added to the model
                System.out.println("Responding to TreeModelListener");
            }
            @Override
            public void treeStructureChanged(TreeModelEvent e) {
                doSomething();

            }

            @Override
            public void treeNodesRemoved(TreeModelEvent e) {
                doSomething();

            }

            @Override
            public void treeNodesInserted(TreeModelEvent e) {
                doSomething();

            }

            @Override
            public void treeNodesChanged(TreeModelEvent e) {
                doSomething();

            }
        });     

        //Add listener to a button which adds nodes to the tree when clicked
        JButton addNode = new JButton("Add node");
        addNode.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New Node");
                DefaultMutableTreeNode root = (DefaultMutableTreeNode) m.getRoot();
                root.add(newNode);
            }
        });

        JScrollPane s = new JScrollPane(t);


        p.add(s);
        p.add(addNode);

        p.setVisible(true);
        f.add(p);
        f.setVisible(true);
    }

}
È stato utile?

Soluzione

Questo perché il modello non conosce l'aggiunta, accade sotto i suoi piedi. Utilizzare i metodi su DefaultTreeModel di fare l'inserimento:

model.insertNodeInto(newNode, root, root.getChildCount())

Modifica

un TreeNode è solo una (più o meno) muto struttura dati. Come si può vedere nel api, non è un osservabile, per cui v'è alcun modo per il modello che utilizza tale struttura di dati per rilevare se qualcosa è cambiato sul nodo. Per rendere più consapevoli del cambiamento, si deve fare una delle due cose

  • utilizzare i metodi di manipolazione nodo del modello
  • aggiornare il nodo e notifica al modello manualmente (chiamata nodesWereInserted)

La prima è la via da preferire (mantiene il controllo a cui appartiene), il secondo potrebbe essere necessario in contesti più complessi (anche se io consiglio vivamente di non lo fanno, è per questo che SwingX DefaultTreeTableModel doesn' t li hanno esposti:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top