📄 treetest.java
字号:
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.InputMethodEvent;
import java.awt.event.InputMethodListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.CellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
public class TreeTest implements MouseListener,KeyListener{
JFrame frame = new JFrame();
DefaultMutableTreeNode root = new DefaultMutableTreeNode(new NoteInfo("root","root")); //主节点
public void doApp(){
frame.setLayout(null);
frame.setBounds(0,0,500,500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTreeModel model = new DefaultTreeModel(getDefaultMutableTreeNode()); //将节点添加中树模型中
MyTree tree = new MyTree(model); //通过树模型创建树
tree.addMouseListener(this); //添加鼠标监听
tree.addKeyListener(this); //添加键盘监听
tree.setEditable(true); //设置节点数据可编辑
tree.setRootVisible(false); //设置主节点不可见
tree.setShowsRootHandles(true); //是否应显示节点句柄(+ -图标)。
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);//设置多选
tree.setVisible(true);
MyRenderer myRenderer=new MyRenderer();
tree.setCellRenderer(myRenderer); //设置图标
tree.setCellEditor(new MyEditor(tree,myRenderer)); //设置编辑器
//tree.setCellEditor(new DefaultTreeCellEditor(tree,myRenderer,new DefaultCellEditor(new JTextField(20)))); //设置编辑器
DefaultMutableTreeNode shop = new DefaultMutableTreeNode(new NoteInfo("AC商店主节点","AC商店主节点")); //商店主节点
root.add(shop);
model.reload(); //必须使用此才能正确显示新增节点后的新树
tree.startEditingAtPath(tree.getPathForRow(0)); //启动树中显示出的第二行为可编辑状态.
JScrollPane pane = new JScrollPane(tree);
pane.setVisible(true);
pane.setBounds(0,0,200,300);
frame.add(pane);
}
public DefaultMutableTreeNode getDefaultMutableTreeNode(){ //通过节点信息类NoteInfo,创建各节点.
DefaultMutableTreeNode book = new DefaultMutableTreeNode(new NoteInfo("A图书主节点","A图书主节点")); //图书主节点
root.add(book);
DefaultMutableTreeNode NoteInfo = new DefaultMutableTreeNode(new NoteInfo("A三国","A三国"));
book.add(NoteInfo);
NoteInfo = new DefaultMutableTreeNode(new NoteInfo("B水浒","B水浒"));
book.add(NoteInfo);
NoteInfo = new DefaultMutableTreeNode(new NoteInfo("C红楼","C红楼"));
book.add(NoteInfo);
DefaultMutableTreeNode car = new DefaultMutableTreeNode(new NoteInfo("汽车主节点","汽车主节点")); //汽车主节点
root.add(car);
NoteInfo = new DefaultMutableTreeNode(new NoteInfo("A法拉利","A法拉利"));
car.add(NoteInfo);
NoteInfo = new DefaultMutableTreeNode(new NoteInfo("B奔驰","B奔驰"));
car.add(NoteInfo);
return root;
}
class MyTree extends JTree{ //使树中节点根据条件确定是否可编辑
public MyTree(DefaultTreeModel model){super(model);}
public boolean isPathEditable(TreePath path){
DefaultMutableTreeNode note = (DefaultMutableTreeNode)path.getLastPathComponent(); //通过path取得节点
NoteInfo info = (NoteInfo)note.getUserObject();
if(info.des.indexOf("C")>=0){return false;} //当树节点信息中存在字符C时,不可编辑.
return true;
}
}
class NoteInfo{ //节点信息,用于节点,所有节点共用这个类。
public String name,des;
public NoteInfo(String name,String des){this.name = name;this.des = des;}
public String toString(){ return name;} //必须有,节点显示名需要此.
}
class MyRenderer extends DefaultTreeCellRenderer{ //设置各节点的图标
ImageIcon icon = new ImageIcon("a.gif");
public Component getTreeCellRendererComponent(JTree tree,Object value,boolean sel,boolean expanded,boolean leaf,int row,boolean hasFocus){
super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
NoteInfo noteInfo = (NoteInfo)node.getUserObject();
if(noteInfo.des.indexOf("A")>=0){this.setIcon(icon);} //当节点信息的des中存在字符A,将此节点的图标设为icon
else {this.setIcon(new ImageIcon("a35.gif"));}
return this;
}
}
class MyEditor extends DefaultTreeCellEditor{ //设置各节点的编辑器
public MyEditor(JTree tree,DefaultTreeCellRenderer renderer){super(tree,renderer);}
public Component getTreeCellEditorComponent(JTree tree,Object value,boolean isSelected,boolean expanded,boolean leaf,int row){
super.getTreeCellEditorComponent(tree,value,isSelected,expanded,leaf,row);
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; //value对应DefaultMutableTreeNode
NoteInfo noteInfo = (NoteInfo)node.getUserObject(); //从节点中取得节点信息NoteInfo.
if(noteInfo.des.indexOf("A")>=0){
JTextField textField = new JTextField(noteInfo.name,20);
this.realEditor = new DefaultCellEditor(textField); //必须给realEditor赋值,否则无法取得正在编辑的值
//已下使编辑节点时有图标
if (editingComponent != null) {editingContainer.remove(editingComponent);}
editingComponent = realEditor.getTreeCellEditorComponent(tree, value,isSelected, expanded,leaf, row);
if (editingComponent != null) {editingContainer.add(editingComponent);}
this.editingIcon = new ImageIcon("edit.gif");
return editingContainer;
//return textField;不能返回此,否则编辑时,节点无图标.
}else{
JComboBox box = new JComboBox(new String[]{"1"+noteInfo.name,"2"+noteInfo.name,"3"+noteInfo.name,"4","5"});
this.realEditor = new DefaultCellEditor(box);
//已下使编辑节点时有图标
if (editingComponent != null) {editingContainer.remove(editingComponent);}
editingComponent = realEditor.getTreeCellEditorComponent(tree, value,isSelected, expanded,leaf, row);
if (editingComponent != null) {editingContainer.add(editingComponent);}
this.editingIcon = new ImageIcon("edit.gif");
return editingContainer;
//return box;不能返回此,否则编辑时,节点无图标.
}
}
}
public static void main(String args[]){ //替换+ -图标
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
UIManager.put("Tree.collapsedIcon", new ImageIcon("collapsedIcon.gif")); //替换图标+
UIManager.put("Tree.expandedIcon", new ImageIcon("expandedIcon.gif"));//替换图标-
}catch(Exception e){}
new TreeTest().doApp();
}
public void mouseClicked(MouseEvent e){ //单击树,打印相应节点的信息,并取消正在编辑的节点的编辑.
JTree tree = (JTree)e.getSource();
if(tree.isEditing() == true){ //如果正在编辑树,则返回 true
DefaultMutableTreeNode note = (DefaultMutableTreeNode)tree.getEditingPath().getLastPathComponent();
NoteInfo info = (NoteInfo)note.getUserObject();
info.name = (String)tree.getCellEditor().getCellEditorValue();
tree.cancelEditing(); //tree.clearSelection();两个都可以,但是不能使用tree.stopEditing()
}
if(tree.isSelectionEmpty() == false){ //当选择的节点不为空时
DefaultMutableTreeNode note = (DefaultMutableTreeNode)tree.getSelectionPath().getLastPathComponent();
NoteInfo info = (NoteInfo)note.getUserObject();
System.out.println(info.des);
}
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {
System.out.println("ddddd");
}
public void mouseExited(MouseEvent e) {}
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) { //添加|删除节点|启动节点编辑
if(e.getKeyChar() == KeyEvent.VK_DELETE){ //删除节点
JTree tree = (JTree)e.getSource();
if(tree.isSelectionEmpty() == false){ //当选择的节点不为空时
DefaultMutableTreeNode note = (DefaultMutableTreeNode)tree.getSelectionPath().getLastPathComponent();
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) note.getParent();
note.removeFromParent(); //删除节点
((DefaultTreeModel)tree.getModel()).reload(parent); //重新加载被删节点的父节点
}
}else if(e.getKeyCode() == KeyEvent.VK_P){ //添加节点
JTree tree = (JTree)e.getSource();
if(tree.isSelectionEmpty() == false){ //当选择的节点不为空时
DefaultMutableTreeNode note = (DefaultMutableTreeNode)tree.getSelectionPath().getLastPathComponent();
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) note.getParent();
parent.add(new DefaultMutableTreeNode(new NoteInfo("添加的节点","添加的节点")));
((DefaultTreeModel)tree.getModel()).reload(parent); //重新加载父节点
}
}else if(e.getKeyChar() == KeyEvent.VK_U){
JTree tree = (JTree)e.getSource();
if(tree.isSelectionEmpty() == false){
tree.startEditingAtPath(tree.getSelectionPath()); //启动节点编辑
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -