Treemodellistenerそれが購読するTreemodelの変化に応答しない
-
26-10-2019 - |
質問
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がそれらを公開していない:)
所属していません StackOverflow