⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treetest.java

📁 java相关的j2me,j2se的一些相关资料
💻 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 + -