自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java Swing編程:JTree樹

開發(fā) 后端
樹這東西給用戶的感覺極為方便,但給程序員帶來很大的麻煩,它是swing中最麻煩的控件之一。樹要弄的好非常麻煩,圖標(biāo)的美化,層次的劃分,各種事件的處理。

樹這東西給用戶的感覺極為方便,但給程序員帶來很大的麻煩,它是swing中最麻煩的控件之一。樹要弄的好非常麻煩,圖標(biāo)的美化,層次的劃分,各種事件的處理。。。對(duì)于初學(xué)者來說,就不要太講究樣式,下面舉個(gè)粗糙的例子,eg

  1. public class SimpleJTree    
  2. {  
  3.     JFrame jf = new JFrame("簡單樹");  
  4.  
  5.     JTree tree;  
  6.     //定義幾個(gè)初始節(jié)點(diǎn)  
  7.     DefaultMutableTreeNode root = new DefaultMutableTreeNode("中國");   
  8.     DefaultMutableTreeNode guangdong = new DefaultMutableTreeNode("廣東");  
  9.     DefaultMutableTreeNode guangxi = new DefaultMutableTreeNode("廣西");  
  10.     DefaultMutableTreeNode foshan = new DefaultMutableTreeNode("佛山");  
  11.     DefaultMutableTreeNode shantou = new DefaultMutableTreeNode("汕頭");  
  12.     DefaultMutableTreeNode guilin = new DefaultMutableTreeNode("桂林");  
  13.     DefaultMutableTreeNode nanning = new DefaultMutableTreeNode("南寧");  
  14.  
  15.     public void init()  
  16.     {  
  17.         //通過add方法建立樹節(jié)點(diǎn)之間的父子關(guān)系  
  18.         guangdong.add(foshan);  
  19.         guangdong.add(shantou);  
  20.         guangxi.add(guilin);  
  21.         guangxi.add(nanning);  
  22.         root.add(guangdong);  
  23.         root.add(guangxi);  
  24.         //以根節(jié)點(diǎn)創(chuàng)建樹  
  25.         tree = new JTree(root);  
  26.  
  27.         //默認(rèn)連線  
  28.         //tree.putClientProperty("JTree.lineStyle" , "Angeled");  
  29.         //沒有連線  
  30.         tree.putClientProperty("JTree.lineStyle" , "None");  
  31.         //水平分隔線  
  32.         //tree.putClientProperty("JTree.lineStyle" , "Horizontal");   
  33.  
  34.  
  35.         //設(shè)置是否顯示根節(jié)點(diǎn)的“展開/折疊”圖標(biāo),默認(rèn)是false  
  36.         tree.setShowsRootHandles(true);  
  37.         //設(shè)置節(jié)點(diǎn)是否可見,默認(rèn)是true  
  38.         tree.setRootVisible(true);  
  39.  
  40.         jf.add(new JScrollPane(tree));  
  41.         jf.pack();  
  42.         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  43.         jf.setVisible(true);  
  44.     }  
  45.  
  46.     public static void main(String[] args)   
  47.     {  
  48.         new SimpleJTree().init();  
  49.     }  
  50. }  

拖動(dòng),編輯樹節(jié)點(diǎn)也是樹的基本功能,下面就在上面例子的基礎(chǔ)上,加上這些功能,eg

  1. public class EditJTree  
  2. {  
  3.     JFrame jf;  
  4.  
  5.     JTree tree;  
  6.     //上面JTree對(duì)象對(duì)應(yīng)的model  
  7.     DefaultTreeModel model;  
  8.       
  9.     //定義幾個(gè)初始節(jié)點(diǎn)  
  10.     DefaultMutableTreeNode root = new DefaultMutableTreeNode("中國");   
  11.     DefaultMutableTreeNode guangdong = new DefaultMutableTreeNode("廣東");  
  12.     DefaultMutableTreeNode guangxi = new DefaultMutableTreeNode("廣西");  
  13.     DefaultMutableTreeNode foshan = new DefaultMutableTreeNode("佛山");  
  14.     DefaultMutableTreeNode shantou = new DefaultMutableTreeNode("汕頭");  
  15.     DefaultMutableTreeNode guilin = new DefaultMutableTreeNode("桂林");  
  16.     DefaultMutableTreeNode nanning = new DefaultMutableTreeNode("南寧");  
  17.  
  18.     //定義需要被拖動(dòng)的TreePath  
  19.     TreePath movePath;  
  20.  
  21.     JButton addSiblingButton = new JButton("添加兄弟節(jié)點(diǎn)");  
  22.     JButton addChildButton = new JButton("添加子節(jié)點(diǎn)");  
  23.     JButton deleteButton = new JButton("刪除節(jié)點(diǎn)");  
  24.     JButton editButton = new JButton("編輯當(dāng)前節(jié)點(diǎn)");  
  25.  
  26.     public void init()  
  27.     {  
  28.         guangdong.add(foshan);  
  29.         guangdong.add(shantou);  
  30.         guangxi.add(guilin);  
  31.         guangxi.add(nanning);  
  32.         root.add(guangdong);  
  33.         root.add(guangxi);  
  34.           
  35.         jf = new JFrame("樹");  
  36.         tree = new JTree(root);  
  37.         //獲取JTree對(duì)應(yīng)的TreeModel對(duì)象  
  38.         model = (DefaultTreeModel)tree.getModel();  
  39.         //設(shè)置JTree可編輯  
  40.         tree.setEditable(true);  
  41.         MouseListener ml = new MouseAdapter()   
  42.         {  
  43.             //按下鼠標(biāo)時(shí)候獲得被拖動(dòng)的節(jié)點(diǎn)  
  44.             public void mousePressed(MouseEvent e)  
  45.             {  
  46.                 //如果需要唯一確定某個(gè)節(jié)點(diǎn),必須通過TreePath來獲取。  
  47.                 TreePath tp = tree.getPathForLocation(e.getX(), e.getY());  
  48.                 if (tp != null)  
  49.                 {  
  50.                     movePath = tp;  
  51.                 }  
  52.             }  
  53.             //鼠標(biāo)松開時(shí)獲得需要拖到哪個(gè)父節(jié)點(diǎn)  
  54.             public void mouseReleased(MouseEvent e)  
  55.             {  
  56.                 //根據(jù)鼠標(biāo)松開時(shí)的TreePath來獲取TreePath  
  57.                 TreePath tp = tree.getPathForLocation(e.getX(), e.getY());  
  58.  
  59.                 if (tp != null && movePath != null)  
  60.                 {  
  61.                     //阻止向子節(jié)點(diǎn)拖動(dòng)  
  62.                     if (movePath.isDescendant(tp) && movePath != tp)  
  63.                     {  
  64.                         JOptionPane.showMessageDialog(jf, "目標(biāo)節(jié)點(diǎn)是被移動(dòng)節(jié)點(diǎn)的子節(jié)點(diǎn),無法移動(dòng)!",   
  65.                             "非法操作", JOptionPane.ERROR_MESSAGE );  
  66.                         return;  
  67.                     }  
  68.                     //既不是向子節(jié)點(diǎn)移動(dòng),而且鼠標(biāo)按下、松開的不是同一個(gè)節(jié)點(diǎn)  
  69.                     else if (movePath != tp)  
  70.                     {  
  71.                         System.out.println(tp.getLastPathComponent());  
  72.                         //add方法可以先將原節(jié)點(diǎn)從原父節(jié)點(diǎn)刪除,再添加到新父節(jié)點(diǎn)中  
  73.                         ((DefaultMutableTreeNode)tp.getLastPathComponent()).add(  
  74.                             (DefaultMutableTreeNode)movePath.getLastPathComponent());  
  75.                         movePath = null;  
  76.                         tree.updateUI();  
  77.                     }  
  78.                 }  
  79.             }  
  80.         };  
  81.         tree.addMouseListener(ml);  
  82.  
  83.         JPanel panel = new JPanel();  
  84.  
  85.         addSiblingButton.addActionListener(new ActionListener()  
  86.         {  
  87.             public void actionPerformed(ActionEvent event)  
  88.             {  
  89.                 //獲取選中節(jié)點(diǎn)  
  90.                 DefaultMutableTreeNode selectedNode  
  91.                     = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();  
  92.                 //如果節(jié)點(diǎn)為空,直接返回  
  93.                 if (selectedNode == nullreturn;  
  94.                 //獲取該選中節(jié)點(diǎn)的父節(jié)點(diǎn)  
  95.                 DefaultMutableTreeNode parent  
  96.                     = (DefaultMutableTreeNode)selectedNode.getParent();  
  97.                 //如果父節(jié)點(diǎn)為空,直接返回  
  98.                 if (parent == nullreturn;  
  99.                 //創(chuàng)建一個(gè)新節(jié)點(diǎn)  
  100.                 DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新節(jié)點(diǎn)");  
  101.                 //獲取選中節(jié)點(diǎn)的選中索引  
  102.                 int selectedIndex = parent.getIndex(selectedNode);  
  103.                 //在選中位置插入新節(jié)點(diǎn)  
  104.                 model.insertNodeInto(newNode, parent, selectedIndex + 1);  
  105.                 //--------下面代碼實(shí)現(xiàn)顯示新節(jié)點(diǎn)(自動(dòng)展開父節(jié)點(diǎn))-------  
  106.                 //獲取從根節(jié)點(diǎn)到新節(jié)點(diǎn)的所有節(jié)點(diǎn)  
  107.                 TreeNode[] nodes = model.getPathToRoot(newNode);  
  108.                 //使用指定的節(jié)點(diǎn)數(shù)組來創(chuàng)建TreePath  
  109.                 TreePath path = new TreePath(nodes);  
  110.                 //顯示指定TreePath  
  111.                 tree.scrollPathToVisible(path);  
  112.             }  
  113.         });  
  114.         panel.add(addSiblingButton);  
  115.  
  116.         addChildButton.addActionListener(new ActionListener()  
  117.         {  
  118.             public void actionPerformed(ActionEvent event)  
  119.             {  
  120.                 //獲取選中節(jié)點(diǎn)  
  121.                 DefaultMutableTreeNode selectedNode  
  122.                     = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();  
  123.                 //如果節(jié)點(diǎn)為空,直接返回  
  124.                 if (selectedNode == nullreturn;  
  125.                 //創(chuàng)建一個(gè)新節(jié)點(diǎn)  
  126.                 DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新節(jié)點(diǎn)");  
  127.                 //直接通過model來添加新節(jié)點(diǎn),則無需通過調(diào)用JTree的updateUI方法  
  128.                 //model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());  
  129.                 //直接通過節(jié)點(diǎn)添加新節(jié)點(diǎn),則需要調(diào)用tree的updateUI方法  
  130.                 selectedNode.add(newNode);  
  131.                 //--------下面代碼實(shí)現(xiàn)顯示新節(jié)點(diǎn)(自動(dòng)展開父節(jié)點(diǎn))-------  
  132.                 TreeNode[] nodes = model.getPathToRoot(newNode);  
  133.                 TreePath path = new TreePath(nodes);  
  134.                 tree.scrollPathToVisible(path);  
  135.                 tree.updateUI();  
  136.             }  
  137.         });  
  138.         panel.add(addChildButton);  
  139.  
  140.         deleteButton.addActionListener(new ActionListener()  
  141.         {  
  142.             public void actionPerformed(ActionEvent event)  
  143.             {  
  144.                 DefaultMutableTreeNode selectedNode  
  145.                     = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();  
  146.                 if (selectedNode != null && selectedNode.getParent() != null)  
  147.                 {  
  148.                     //刪除指定節(jié)點(diǎn)  
  149.                     model.removeNodeFromParent(selectedNode);  
  150.                 }  
  151.             }  
  152.         });  
  153.         panel.add(deleteButton);  
  154.  
  155.         editButton.addActionListener(new ActionListener()  
  156.         {  
  157.             public void actionPerformed(ActionEvent event)  
  158.             {  
  159.                 TreePath selectedPath = tree.getSelectionPath();  
  160.                 if (selectedPath != null)  
  161.                 {  
  162.                     //編輯選中節(jié)點(diǎn)  
  163.                     tree.startEditingAtPath(selectedPath);  
  164.                 }  
  165.             }  
  166.         });  
  167.         panel.add(editButton);  
  168.  
  169.         jf.add(new JScrollPane(tree));  
  170.         jf.add(panel , BorderLayout.SOUTH);  
  171.         jf.pack();  
  172.         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  173.         jf.setVisible(true);  
  174.     }  
  175.  
  176.     public static void main(String[] args)   
  177.     {  
  178.         new EditJTree().init();  
  179.     }  
  180. }  

最后講下如何修飾tree的圖標(biāo),主要是通過拓展TreeCellRenderer來實(shí)現(xiàn),eg

  1. public class ExtendsDefaultTreeCellRenderer    
  2. {  
  3.     JFrame jf = new JFrame("根據(jù)節(jié)點(diǎn)類型定義圖標(biāo)");  
  4.  
  5.     JTree tree;  
  6.     //定義幾個(gè)初始節(jié)點(diǎn)  
  7.     DefaultMutableTreeNode root = new DefaultMutableTreeNode(  
  8.         new NodeData(DBObjectType.ROOT , "數(shù)據(jù)庫導(dǎo)航"));   
  9.     DefaultMutableTreeNode salaryDb = new DefaultMutableTreeNode(  
  10.         new NodeData(DBObjectType.DATABASE , "公司工資數(shù)據(jù)庫"));  
  11.     DefaultMutableTreeNode customerDb = new DefaultMutableTreeNode(  
  12.         new NodeData(DBObjectType.DATABASE , "公司客戶數(shù)據(jù)庫"));  
  13.     //定義salaryDb的兩個(gè)子節(jié)點(diǎn)  
  14.     DefaultMutableTreeNode employee = new DefaultMutableTreeNode(  
  15.         new NodeData(DBObjectType.TABLE , "員工表"));  
  16.     DefaultMutableTreeNode attend = new DefaultMutableTreeNode(  
  17.         new NodeData(DBObjectType.TABLE , "考勤表"));  
  18.     //定義customerDb的一個(gè)子節(jié)點(diǎn)  
  19.     DefaultMutableTreeNode contact = new DefaultMutableTreeNode(  
  20.         new NodeData(DBObjectType.TABLE , "聯(lián)系方式表"));  
  21.  
  22.     //定義employee的三個(gè)子節(jié)點(diǎn)  
  23.     DefaultMutableTreeNode id = new DefaultMutableTreeNode(  
  24.         new NodeData(DBObjectType.INDEX , "員工ID"));  
  25.     DefaultMutableTreeNode name = new DefaultMutableTreeNode(  
  26.         new NodeData(DBObjectType.COLUMN , "姓名"));  
  27.     DefaultMutableTreeNode gender = new DefaultMutableTreeNode(  
  28.         new NodeData(DBObjectType.COLUMN , "性別"));  
  29.  
  30.     public void init()throws Exception  
  31.     {  
  32.         //通過add方法建立樹節(jié)點(diǎn)之間的父子關(guān)系  
  33.         root.add(salaryDb);  
  34.         root.add(customerDb);  
  35.         salaryDb.add(employee);  
  36.         salaryDb.add(attend);  
  37.         customerDb.add(contact);  
  38.         employee.add(id);  
  39.         employee.add(name);  
  40.         employee.add(gender);  
  41.         //以根節(jié)點(diǎn)創(chuàng)建樹  
  42.         tree = new JTree(root);  
  43.           
  44.         //設(shè)置該JTree使用自定義的節(jié)點(diǎn)繪制器  
  45.         tree.setCellRenderer(new MyRenderer());  
  46.       
  47.         //設(shè)置是否顯示根節(jié)點(diǎn)的“展開/折疊”圖標(biāo),默認(rèn)是false  
  48.         tree.setShowsRootHandles(true);  
  49.         //設(shè)置節(jié)點(diǎn)是否可見,默認(rèn)是true  
  50.         tree.setRootVisible(true);  
  51.  
  52.         //設(shè)置使用Windows風(fēng)格外觀  
  53.         UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");  
  54.         //更新JTree的UI外觀  
  55.         SwingUtilities.updateComponentTreeUI(tree);  
  56.  
  57.         jf.add(new JScrollPane(tree));  
  58.         jf.pack();  
  59.         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  60.         jf.setVisible(true);  
  61.     }  
  62.  
  63.     public static void main(String[] args) throws Exception  
  64.     {  
  65.         new ExtendsDefaultTreeCellRenderer().init();  
  66.     }  
  67. }  
  68. //定義一個(gè)NodeData類,用于封裝節(jié)點(diǎn)數(shù)據(jù)  
  69. class NodeData  
  70. {  
  71.     public int nodeType;  
  72.     public String nodeData;  
  73.     public NodeData(int nodeType , String nodeData)  
  74.     {  
  75.         this.nodeType = nodeType;  
  76.         this.nodeData = nodeData;  
  77.     }  
  78.     public String toString()  
  79.     {  
  80.         return nodeData;  
  81.     }  
  82. }  
  83. //定義一個(gè)接口,該接口里包含數(shù)據(jù)庫對(duì)象類型的常量  
  84. interface DBObjectType  
  85. {  
  86.     int ROOT = 0;  
  87.     int DATABASE = 1;  
  88.     int TABLE = 2;  
  89.     int COLUMN = 3;  
  90.     int INDEX = 4;  
  91. }  
  92. class MyRenderer extends DefaultTreeCellRenderer  
  93. {  
  94.     //初始化5個(gè)圖標(biāo)  
  95.     ImageIcon rootIcon = new ImageIcon("icon/root.gif");  
  96.     ImageIcon databaseIcon = new ImageIcon("icon/database.gif");  
  97.     ImageIcon tableIcon = new ImageIcon("icon/table.gif");  
  98.     ImageIcon columnIcon = new ImageIcon("icon/column.gif");  
  99.     ImageIcon indexIcon = new ImageIcon("icon/index.gif");  
  100.  
  101.     public Component getTreeCellRendererComponent(JTree tree, Object value,  
  102.         boolean sel, boolean expanded,  boolean leaf, int row, boolean hasFocus)  
  103.     {  
  104.         //執(zhí)行父類默認(rèn)的節(jié)點(diǎn)繪制操作  
  105.         super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);  
  106.  
  107.         DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;  
  108.         NodeData data = (NodeData)node.getUserObject();  
  109.         //根據(jù)數(shù)據(jù)節(jié)點(diǎn)里的nodeType數(shù)據(jù)決定節(jié)點(diǎn)圖標(biāo)  
  110.         ImageIcon icon = null;  
  111.         switch(data.nodeType)  
  112.         {  
  113.             case DBObjectType.ROOT:  
  114.                 icon = rootIcon;  
  115.                 break;  
  116.             case DBObjectType.DATABASE:  
  117.                 icon = databaseIcon;  
  118.                 break;  
  119.             case DBObjectType.TABLE:  
  120.                 icon = tableIcon;  
  121.                 break;  
  122.             case DBObjectType.COLUMN:  
  123.                 icon = columnIcon;  
  124.                 break;  
  125.             case DBObjectType.INDEX:  
  126.                 icon = indexIcon;  
  127.                 break;  
  128.         }  
  129.         //改變圖標(biāo)  
  130.         this.setIcon(icon);  
  131.         return this;  
  132.     }  

圖標(biāo)大家就自己搞幾個(gè)吧,不搞也可以看到效果。明天我將講下JTable,也是個(gè)麻煩的控件。

原文鏈接:http://blog.csdn.net/terryzero/article/details/3828045

【編輯推薦】

  1. Java Swing編程:微調(diào)控制器和列表框
  2. Java Swing編程:進(jìn)度條和滑動(dòng)條
  3. Java Swing編程:Applet和JApplet
  4. Java Swing編程:拖放功能
  5. Java Swing編程:特殊容器
責(zé)任編輯:林師授 來源: terryzero的博客
相關(guān)推薦

2009-07-10 18:06:59

JTree Swing

2009-07-15 10:52:13

JTree組件

2012-01-17 13:46:55

JavaSwing

2012-01-17 14:09:54

JavaSwing

2012-01-17 13:41:34

JavaSwing

2012-01-17 13:16:34

JavaSwing

2012-01-17 13:53:16

JavaSwing

2012-01-17 13:58:17

JavaSwing

2012-01-17 14:01:33

JavaSwing

2009-06-10 16:17:00

Netbeans JT初始化

2021-03-18 08:44:20

Java數(shù)據(jù)結(jié)構(gòu)算法

2009-07-16 11:13:50

Java Swing

2009-07-10 14:20:01

AcceleratorJava Swing

2009-07-10 11:45:44

Java Swing

2009-07-15 13:48:26

Swing模型和渲染器

2021-04-07 09:26:37

Java數(shù)據(jù)結(jié)構(gòu)算法

2009-07-10 15:10:02

Java Swing經(jīng)

2009-07-10 10:47:01

Java Swing

2009-07-10 13:09:53

.Net與Java S

2009-07-16 08:53:03

Swing任務(wù)Swing線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)