Java Swing-在节点删除时调用JTree addTreeSelectionListener
我对荡秋千还不熟悉,如果这是一种预期的行为,我很抱歉 我有一个DeleteAll按钮,它删除所有JTree节点。很好用 但我想知道,如果我选择一个节点,然后单击DeleteAll按钮,为什么会调用“addTreeSelectionListener” 请建议如何避免这种情况Java Swing-在节点删除时调用JTree addTreeSelectionListener,java,swing,jtree,Java,Swing,Jtree,我对荡秋千还不熟悉,如果这是一种预期的行为,我很抱歉 我有一个DeleteAll按钮,它删除所有JTree节点。很好用 但我想知道,如果我选择一个节点,然后单击DeleteAll按钮,为什么会调用“addTreeSelectionListener” 请建议如何避免这种情况 import java.awt.*; import java.awt.event.ActionEvent; import javax.swing.*; import javax.swing.tr
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
public class JTreeDemo {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JTreeFrame();
frame.setTitle("JTree Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class JTreeFrame extends JFrame {
public JTreeFrame() {
setSize(300, 300);
DefaultMutableTreeNode country = new DefaultMutableTreeNode("Animal");
DefaultMutableTreeNode state = new DefaultMutableTreeNode("Tiger");
country.add(state);
JButton deleteAll = new JButton("DeleteAll");
JTree tree = new JTree(country);
deleteAll.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
System.out.println("Delete started...");
DefaultTreeModel ttmodel = (DefaultTreeModel) tree.getModel();
//ttmodel.setRoot(null);
DefaultMutableTreeNode troot = (DefaultMutableTreeNode) ttmodel.getRoot();
troot.removeAllChildren();
ttmodel.reload();
}
}
);
tree.addTreeSelectionListener(e -> {
TreePath path = e.getPath();
System.out.println(path);
});
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
deleteAll, new JScrollPane(tree));
add(new JScrollPane(splitPane));
}
}
你选择了一个节点,然后删除了,选择已经改变了…耶,我猜是这样的,我们怎么能避免它呢?那要看情况了。简单的解决方案是在删除节点并重新添加之前删除侦听器,更复杂的解决方案是使用一个标志,该标志将强制侦听器在设置时忽略更改感谢您的建议,而不是使用标志处理,删除和添加侦听器将很容易。我要试试这个。