구독하는 모델의 변경 내용에 응답하기 위해 TreeModelChanged 수신기를 가져올 수없는 이유를 이해해야합니다.TreeModelListener가 구독하는 TreeModel의 변경 내용에 응답하지 않습니다.
작은 예제에서 문제를 재현 해 냈습니다.
새 노드가 트리에 추가 될 때마다 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 객체의 상태 변경을 감시한다고 생각했습니다. 나는 위의 코드 예제와 같은 노드를 추가하는 것이 그와 같을 것이라고 생각했을 것입니다. – 8bitjunkie
설명 주셔서 감사합니다. – 8bitjunkie