2

TreeModelChangedリスナーが、サブスクライブしているモデルの変更に応答できない理由をわざわざ理解しています。

私は小さな例で問題を再現することができました。

SysOutメッセージは、新しいノードがツリーに追加されるたびにコンソールに出力されません。

SysOutメッセージを、ツリーを再描画するためのいくつかのコマンドに置き換えるつもりです。現在、リスナーが解雇されていないことを証明するためだけにSysOutメッセージを使用しています。

私は何か基本的なものが欠けていますか?

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

}
4

1 に答える 1

2

これは、モデルが追加について知らないため、足元で発生します。DefaultTreeModelのメソッドを使用して、挿入を行います。

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

編集

TreeNodeは、単なる(多かれ少なかれ)ダムデータ構造です。APIでわかるように、これはObservableではないため、そのデータ構造を使用するモデルがノードで変更があったかどうかを検出する方法はありません。変更を認識させるには、次の2つのいずれかを実行する必要があります

  • モデルのノード操作方法を使用する
  • ノードを更新し、モデルに手動で通知します(nodesWereInsertedを呼び出します)

最初の方法は(それが属する場所を制御し続ける)好ましい方法であり、2番目の方法はより複雑なコンテキストで必要になる可能性があります(絶対にしないことを強くお勧めしますが、SwingXDefaultTreeTableModelではそれらが公開されていないのはそのためです:)

于 2011-11-30T16:19:05.380 に答える