天天看點

Java Swing 樹元件全屏化

Java Swing 樹元件全屏化
JPanel btnPanel = new JPanel(); //中間容器
        btnPanel.setLayout(new GridLayout(1,1));
    //建立JTree對象
        JTree tree = new JTree(root);
        //把JTree放入到視窗中進行展示
        btnPanel.add(tree);      
package Tree;

import javax.swing.*;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import java.awt.*;


/**
 * Created with IntelliJ IDEA.
 *
 * @Author: 從南到北
 * @Date: 11/26/2021/11:11
 * @Description:

 *
 */

public class TreePre extends JFrame implements TreeModelListener {

    DefaultMutableTreeNode root =new DefaultMutableTreeNode("今天要買的東西");
    //使用DefaultMutableTreeNode建立4個枝節點
    DefaultMutableTreeNode node1 =new DefaultMutableTreeNode("蔬菜");
    DefaultMutableTreeNode node2 =new DefaultMutableTreeNode("水果");
    DefaultMutableTreeNode node3 =new DefaultMutableTreeNode("禮品");
    DefaultMutableTreeNode node4 =new DefaultMutableTreeNode("家用小物品");

    //定義按鈕,完成操作
    JButton addSiblingBtn = new JButton("添加兄弟結點");
    JButton addChildBtn = new JButton("添加子結點");
    JButton deleteBtn = new JButton("删除結點");
    JButton editBtn = new JButton("編輯目前結點");


    public TreePre(){
        setTitle("購物清單");

        JPanel panel = new JPanel();    //建立中間容器

//        setContentPane(panel);  //添加中間容器

        //将4個枝節點添加到根節點
        root.add(node1);
        root.add(node2);
        root.add(node3);
        root.add(node4);

        //使用其建立葉節點,并且将葉子節點添加到不同的枝節點上
        DefaultMutableTreeNode baicai =new DefaultMutableTreeNode("白菜");
        node1.add(baicai);
        DefaultMutableTreeNode dasuan = new DefaultMutableTreeNode("大蒜");
        node1.add(dasuan);
        DefaultMutableTreeNode tudou = new DefaultMutableTreeNode("洋芋");
        node1.add(tudou);

        DefaultMutableTreeNode pingguo = new DefaultMutableTreeNode("蘋果");
        node2.add(pingguo);
        DefaultMutableTreeNode xiangjiao = new DefaultMutableTreeNode("香蕉");
        node2.add(xiangjiao);
        DefaultMutableTreeNode xigua = new DefaultMutableTreeNode("西瓜");
        node2.add(xigua);

        DefaultMutableTreeNode  lipin = new DefaultMutableTreeNode("禮品");
        node3.add(lipin);
        DefaultMutableTreeNode  maotai = new DefaultMutableTreeNode("茅台酒");
        node3.add(maotai);
        DefaultMutableTreeNode  maipian = new DefaultMutableTreeNode("營養麥片");
        node3.add(maipian);
        DefaultMutableTreeNode   shipin = new DefaultMutableTreeNode("保健食品");
        node3.add(shipin);

        DefaultMutableTreeNode  weijing = new DefaultMutableTreeNode("味精");
        node4.add(weijing);
        DefaultMutableTreeNode  jiangyou = new DefaultMutableTreeNode("醬油");
        node4.add(jiangyou);
        DefaultMutableTreeNode   xijiejing = new DefaultMutableTreeNode("洗潔精");
        node4.add(xijiejing);
        DefaultMutableTreeNode   baoxiandai = new DefaultMutableTreeNode("保鮮袋");
        node4.add(baoxiandai);

        JTree tree = new JTree(root);   //建立一個系統預設的樹元件
        tree.setEditable(true);     //設定JTree為可編輯

        DefaultTreeModel model = (DefaultTreeModel) tree.getModel();

        addSiblingBtn.addActionListener(e -> {
            //添加兄弟結點的邏輯
//                    1, 擷取目前選中節點
                // DefaultMutableTreeNode這個是一個實作類
                DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
                //如果結點為空,則直接傳回
                if (selectedNode == null){
                    return;
                }
//                    2,擷取該選中結點的父結點
                DefaultMutableTreeNode parent = (DefaultMutableTreeNode)selectedNode.getParent();
                //如果父結點為空,則直接傳回
                if (parent==null){
                    return;
                }
                //                3,建立一個新結點
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新結點");
                //                4,把新結點通過父結點進行添加
                //擷取選中結點的索引
                int selectedIndex = parent.getIndex(selectedNode);
                //在選中位置插入新結點
                model.insertNodeInto(newNode,parent,selectedIndex);

                //                5,顯示新結點
                //擷取從根結點到新結點的所有結點,這個函數是傳回從根節點到newNode新節點的路徑
                TreeNode[] pathToRoot = model.getPathToRoot(newNode);

                //使用指定的結點數組建立TreePath
                TreePath treePath = new TreePath(pathToRoot);

                //顯示指定的treePath
                tree.scrollPathToVisible(treePath); //将視野移動到這個新節點
                //6,重繪tree
                tree.updateUI();
//                label.setText("新增節點成功");

        });

        /**
         * 添加子節點
         */

        addChildBtn.addActionListener(e -> {    //蘭姆達表達式寫法,會更友善點
            //為選中節點添加子節點

            //1,擷取選中結點
            DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
            if (selectedNode==null){
                return ;
            }

            //2,建立新結點
            DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新結點");

            //3,把新節點添加到目前節點中

            //model.insertNodeInto(newNode,selectedNode,selectedNode.getChildCount());使用TreeModel的方法添加,不需要手動重新整理UI
            selectedNode.add(newNode);//使用TreeNode的方法添加,需要手動重新整理UI

            //4,顯示新節點

            //顯示新結點

            TreeNode[] pathToRoot = model.getPathToRoot(newNode);
            TreePath treePath = new TreePath(pathToRoot);
            tree.scrollPathToVisible(treePath);

            //5,重繪ui
            //手動重新整理UI
            tree.updateUI();
//            label.setText("新增子節點成功");
        });


        /**
         * 删除節點
         */

        deleteBtn.addActionListener(e -> {
            DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
            if (selectedNode!=null && selectedNode.getParent()!=null){
                //删的時候要找到其父節點才能删,是以說,最後的那個根節點,不能删
                model.removeNodeFromParent(selectedNode);
            }
//            label.setText("删除節點成功");
        });

        /**
         * 編輯節點
         */
        //實作編輯結點的監聽器
        editBtn.addActionListener(e -> {
            //擷取目前選中節點的路徑
            TreePath selectionPath = tree.getSelectionPath();
            //判斷路徑不為空,則設定最後一個節點可以編輯
            if (selectionPath!=null){
                //編輯選中結點
                tree.startEditingAtPath(selectionPath);
            }

        });

        //panel用來寫按鈕
        panel.add(addSiblingBtn);
        panel.add(addChildBtn);
        panel.add(deleteBtn);
        panel.add(editBtn);
        panel.setLayout(new FlowLayout());

       /**
         * panel用來裝按鈕
         * panel1用來裝樹和按鈕
         * tabbedPane用來裝頁籤
         * 建立一個面闆,用來裝樹和按鈕
         *建立一個分隔欄
         *左邊設定為樹和添加按鈕,右邊設定為頁籤元件
         *
         */
        JPanel panel1 = new JPanel();
//        panel1.add(panel,BorderLayout.NORTH);
//
//        panel1.add(new JScrollPane(tree),BorderLayout.EAST);

        panel1.setLayout(new GridLayout(2,1));

        panel1.add(new JScrollPane(tree));

        panel1.add(panel);
//        add(panel, BorderLayout.NORTH);
//        add(new JScrollPane(tree),BorderLayout.CENTER);

        JSplitPane js = new JSplitPane();

        js.setOneTouchExpandable(true);
        js.setContinuousLayout(true);
        js.setPreferredSize(new Dimension(300,400));
        js.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
        js.setDividerSize(1);
        js.setDividerLocation(50);


//      JPanel panel2 = new JPanel();
        JButton jButton = new JButton();

        //-------------------
        JTabbedPane tabbedPane= new JTabbedPane(); //建立一個頁籤容器
        setContentPane(tabbedPane);  //将之添加到頂層容器内

        JPanel P1=new JPanel();
        JPanel P2=new JPanel();
        JPanel P3=new JPanel();

        Label a1 = new Label("内容1");
        Button b2 = new Button("内容2");
        Label a3 = new Label("内容3");

        P1.add(a1);
        P2.add(b2);
        P3.add(a3);

        //添加頁籤容器,并且設定其中每一個頁籤的标簽以及是否可啟用
        tabbedPane.addTab("頁籤1",P1);
        // 設定 index 位置的頁籤是否可用
//        tabbedPane.setEnabledAt(0,true);
        // 設定 index 位置的頁籤的标題
//        tabbedPane.setTitleAt(0,"個人收入狀況");

        tabbedPane.addTab("頁籤2",P2);
//        tabbedPane.setEnabledAt(1,true);
//        tabbedPane.setTitleAt(1,"工資");

        tabbedPane.addTab("頁籤3",P3);
//        tabbedPane.setEnabledAt(2,true);
//        tabbedPane.setTitleAt(2,"獎金");

        // 設定預設選中的頁籤
        tabbedPane.setSelectedIndex(1);
//      setSize(500,300);
        tabbedPane.setPreferredSize(new Dimension(500,200));


        /**
         * 設定頁籤左右兩邊的内容
         * 并将頁籤放到頂層容器中
         *
         */

        js.setLeftComponent(panel1);  //左邊内容
        js.setRightComponent(tabbedPane); //右邊内容
        setContentPane(js);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);

    }

    public static void main(String[] args) {
        new TreePre();
    }

    @Override
    public void treeNodesChanged(TreeModelEvent e) {

    }

    @Override
    public void treeNodesInserted(TreeModelEvent e) {

    }

    @Override
    public void treeNodesRemoved(TreeModelEvent e) {

    }

    @Override
    public void treeStructureChanged(TreeModelEvent e) {

    }
}