質問

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

}
役に立ちましたか?

解決

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

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

編集

TreeNodeは、(多かれ少なかれ)愚かなデータ構造です。 APIでわかるように、それは観察可能ではないので、 ありえない そのデータ構造を使用して、ノードで何かが変更されたかどうかを検出するモデルの場合。変更を認識させるには、2つのことのいずれかを実行する必要があります

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

1つ目は好ましい方法(属する場所を制御する)です。2つ目は、より複雑なコンテキストで必要になる場合があります(ただし、強くお勧めしますが 一度もない それをする、だからこそ、swingx defaulttreetablemodelがそれらを公開していない:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top