TreeModelListener ne répond pas aux changements de TreeModel auxquelles il a souscrit à

StackOverflow https://stackoverflow.com/questions/8328967

  •  26-10-2019
  •  | 
  •  

Question

Je vais avoir un peu pris la peine de comprendre pourquoi je ne peux pas obtenir un auditeur TreeModelChanged pour répondre aux changements dans le modèle qu'il est abonné à.

J'ai réussi à reproduire le problème dans un petit exemple.

Le message SYSOUT n'imprime pas sur la console à chaque fois qu'un nouveau noeud est ajouté à l'arbre.

J'ai l'intention de remplacer le message sysout avec quelques commandes pour redessiner l'arbre. En ce moment je suis en utilisant un message SYSOUT juste pour prouver que l'auditeur ne soit tiré.

Suis-je manque quelque chose de fondamental?

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);
    }

}
Était-ce utile?

La solution

qui est parce que le modèle ne connaît pas l'addition, il se passe sous ses pieds. Utilisez les méthodes sur DefaultTreeModel pour faire l'insertion:

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

Modifier

un TreeNode se trouve une structure de données muet (plus ou moins). Comme vous pouvez le voir dans le api, ce n'est pas un Observable, donc il est aucun moyen pour le modèle qui utilise cette structure de données pour détecter si quelque chose a changé sur le nœud. Pour ce faire prendre conscience du changement, vous devez faire une des deux choses

  • utiliser les méthodes de manipulation de noeud du modèle
  • mettre à jour le noeud et aviser le modèle manuellement (appelant nodesWereInserted)

La première est la façon préférable (garde le contrôle où il appartient), la seconde peut être nécessaire dans des contextes plus complexes (bien que je recommande fortement à jamais le faire, c'est pourquoi SwingX DefaultTreeTableModel n » t ont les exposés:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top