Скажем, я кодирую редактируемую файловую систему дерева и добавляю прослушиватель действий для кнопки «добавить ребенка». То есть, как только я выберу узел в дереве и нажмите кнопку «Добавить ребенка». Должен быть новый узел «Новый», становящийся его ребенком, который был показан на рис.1.insertNodeInto функция работает только при первой вставке (работает для листового узла)
(К сожалению я не имею 10 репутации размещать изображения .. Но, вероятно, вы можете запустить полный код ниже.)
Но дело в том, мой слушатель работает только в первой вставке, что означает, что он только работает для листового узла.
Когда я пытаюсь добавить новый узел в узел «Thing», дерево не изменяется. Хотя этот показатель не изменился, возвращаемое значение возврата функции .childCount() изменилось в зависимости от того, что отображается на консоли.
addChildButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent action)
{
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) m_tree.
getLastSelectedPathComponent();
if (selectedNode == null)
{
System.out.println("selected null");
return ;
}
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");
System.out.println(selectedNode.getChildCount());
m_model.insertNodeInto(newNode, selectedNode,
selectedNode.getChildCount());
// display the new node
m_tree.scrollPathToVisible(new TreePath(newNode.getPath()));
}
});
Для тех, кто хочет, чтобы запустить программу, полный код здесь:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.tree.*;
public class TreeEditTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new TreeEditFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class TreeEditFrame extends JFrame
{
public TreeEditFrame()
{
setTitle("TreeEditTest");
setSize(M_DEFAULT_WIDTH, M_DEFAULT_HEIGHT);
// construct tree
TreeNode root = makeSampleTree();
m_model = new DefaultTreeModel(root);
m_tree = new JTree(root);
m_tree.setEditable(true);
// add scroll pane with tree
JScrollPane scrollPane = new JScrollPane(m_tree);
add(scrollPane, BorderLayout.CENTER);
// make buttons
makeButtons();
}
private TreeNode makeSampleTree()
{
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Thing");
DefaultMutableTreeNode pizza = new DefaultMutableTreeNode("Pizza");
DefaultMutableTreeNode pizzaBase = new DefaultMutableTreeNode("PizzaBase");
DefaultMutableTreeNode pizzaTopping = new DefaultMutableTreeNode("PizzaTopping");
root.add(pizza);
root.add(pizzaBase);
root.add(pizzaTopping);
DefaultMutableTreeNode deepPanBase = new DefaultMutableTreeNode("DeepPanBase");
DefaultMutableTreeNode thinAndCrispyBase = new DefaultMutableTreeNode("ThinAndCrispyBase");
pizzaBase.add(deepPanBase);
pizzaBase.add(thinAndCrispyBase);
return root;
}
private void makeButtons()
{
JPanel panel = new JPanel();
JButton addChildButton = new JButton("Add Child");
JButton addSiblingButton = new JButton("Add Sibling");
JButton deleteButton = new JButton("Delete");
addChildButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent action)
{
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) m_tree.
getLastSelectedPathComponent();
if (selectedNode == null)
{
System.out.println("selected null");
return ;
}
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");
System.out.println(selectedNode.getChildCount());
m_model.insertNodeInto(newNode, selectedNode,
selectedNode.getChildCount());
// display the new node
m_tree.scrollPathToVisible(new TreePath(newNode.getPath()));
}
});
addSiblingButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent action)
{
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) m_tree.
getLastSelectedPathComponent();
if (selectedNode == null)
{
System.out.println("selected null");
return ;
}
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.
getParent();
if (parent == null)
{
System.out.println("parent null");
return ;
}
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");
int selectedIndex = parent.getIndex(selectedNode);
// System.out.println(parent.getChildCount());
// m_model.insertNodeInto(newNode, parent, parent.getChildCount());
System.out.println(selectedIndex+1);
m_model.insertNodeInto(newNode, parent, selectedIndex+1);
// now display the new node
TreeNode[] nodes = m_model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
m_tree.scrollPathToVisible(path);
}
});
deleteButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent action)
{
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) m_tree.
getLastSelectedPathComponent();
if (selectedNode == null)
{
System.out.println("selected null");
return ;
}
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.
getParent();
if (parent == null)
{
System.out.println("Cannot delete the \"Thing\" node");
return ;
}
m_model.removeNodeFromParent(selectedNode);
}
});
panel.add(addChildButton);
panel.add(addSiblingButton);
panel.add(deleteButton);
add(panel, BorderLayout.NORTH);
}
private DefaultTreeModel m_model;
private JTree m_tree;
private static final int M_DEFAULT_WIDTH = 400;
private static final int M_DEFAULT_HEIGHT = 200;
}
Большое спасибо! Мне все еще интересно, почему этот «add child» прослушиватель работает для листового узла;) –