树控件通过setEditable(true)方法设置可编辑条件下,可以添加新节点了。为当前选中的节点添加新的节点有两点需要考虑(主要考虑节点保存的用户对象是字符串的情况):
1.是否存在相同的节点(查找保存的用户对象是否相同)代码如下:
private boolean isfindNode(DefaultMutableTreeNode dmtn, String text)
{
if(dmtn.getChildCount()==0)
return false;
int count = dmtn.getChildCount();
for(int i=0;i<count;i++)
{
DefaultMutableTreeNode t = (DefaultMutableTreeNode) dmtn.getChildAt(i);
String str = (String) t.getUserObject();
if(text.equals(str))
return true;
}
return false;
}
2.添加完节点,让新节点处于被选择状态。代码如下:
//转到新添加的节点
private void scrollToNode(DefaultMutableTreeNode t)
{
DefaultTreeModel dtm = (DefaultTreeModel) tree.getModel();
//TreeNode[] tns = dtm.getPathToRoot(t);
TreeNode[] tns = t.getPath();
TreePath tp = new TreePath(tns);
tree.scrollPathToVisible(tp);
tree.setSelectionPath(tp);//当前选择的是tns的父节点,需要tns被选择
tree.updateUI();
}
全部代码如下:
package tree;
import java.awt.BorderLayout;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.border.TitledBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
public class CopeTree extends JFrame
{
public JTree tree;
static int index = 0;
JTextField jtf ;
public CopeTree()
{
JPanel panel = new JPanel();
initTree();
add(tree);
tree.setBorder(new TitledBorder("普通树控件"));
jtf = new JTextField(30);
jtf.addActionListener(event->{
addNode();
});
panel.add(jtf);
JButton jbn_add = new JButton("添加节点");
jbn_add.addActionListener(event -> {
addNode();
}
);
panel.add(jbn_add);
add(panel, BorderLayout.SOUTH);
init();
}
private void addNode()
{
String text = jtf.getText();
if (text == null || text.equals("") || text.trim().equals(""))
{
JOptionPane.showMessageDialog(this, "节点名称不能为空");
return;
}
DefaultMutableTreeNode tmtn = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
if (tmtn != null)
{
boolean result = isfindNode(tmtn, text);
if (result)
{
JOptionPane.showMessageDialog(this, "存在相同节点"+text);
jtf.requestFocus();
jtf.selectAll();
return;// 存在相同节点
}
DefaultMutableTreeNode t = new DefaultMutableTreeNode(text);
tmtn.add(t);
jtf.setText("");
scrollToNode(t);
}
else
{
JOptionPane.showMessageDialog(this, "没有选择节点");
return;
}
}
//转到新添加的节点
private void scrollToNode(DefaultMutableTreeNode t)
{
DefaultTreeModel dtm = (DefaultTreeModel) tree.getModel();
//TreeNode[] tns = dtm.getPathToRoot(t);
TreeNode[] tns = t.getPath();
TreePath tp = new TreePath(tns);
tree.scrollPathToVisible(tp);
tree.setSelectionPath(tp);//当前选择的是tns的父节点,需要tns被选择
tree.updateUI();
}
private boolean isfindNode(DefaultMutableTreeNode dmtn, String text)
{
if(dmtn.getChildCount()==0)
return false;
int count = dmtn.getChildCount();
for(int i=0;i<count;i++)
{
DefaultMutableTreeNode t = (DefaultMutableTreeNode) dmtn.getChildAt(i);
String str = (String) t.getUserObject();
if(text.equals(str))
return true;
}
return false;
}
private void initTree()
{
// TODO Auto-generated method stub
DefaultMutableTreeNode root = new DefaultMutableTreeNode("科学");
DefaultMutableTreeNode shuxue = new DefaultMutableTreeNode("数学");
DefaultMutableTreeNode jisuanji = new DefaultMutableTreeNode("计算机");
root.add(shuxue);
root.add(jisuanji);
addTreeNode(shuxue,new String[] {"数论","几何","代数"});
addTreeNode(jisuanji,new String[] {"编程语言","操作系统","算法"});
tree = new JTree(root);
tree.setEditable(true);
}
private void addTreeNode(DefaultMutableTreeNode parent, String[] strs)
{
for(int i = 0;i<strs.length;i++)
{
DefaultMutableTreeNode temp = new DefaultMutableTreeNode(strs[i]);
parent.add(temp);
}
}
public void init()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600, 500);
this.setLocationRelativeTo(null);
this.setTitle("树控件");
this.setVisible(true);
}
}
运行如下:
1.png
2.png
由于水平有限,如果有错误,请大家多多指导,提高水平,共同学习。