javaFx(8)TreeView

这里写图片描述

package application;

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    // Node图标
    private final Node rootIcon = new ImageView(
        new Image(getClass().getResourceAsStream("文件夹.png"))
    );

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

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Tree View Sample");        

        // TreeItem名字和图标
        TreeItem<String> rootItem = new TreeItem<> ("Inbox", rootIcon);
        rootItem.setExpanded(true);
        // 每个Item下又可以添加新的Item
        for (int i = 1; i < 6; i++) {
            TreeItem<String> item = new TreeItem<> ("Message" + i); 
            item.getChildren().add(new TreeItem<String>("第三级"));
            rootItem.getChildren().add(item);
        }        
        // 创建TreeView
        TreeView<String> tree = new TreeView<> (rootItem);   

        StackPane root = new StackPane();
        root.getChildren().add(tree);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

这里写图片描述

package application;

import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import javafx.beans.property.SimpleStringProperty;
import javafx.scene.layout.VBox;

public class Main extends Application {

    // 两个Node图标
    private final Node rootIcon = 
        new ImageView(new Image(getClass().getResourceAsStream("文件夹.png")));
    private final Image depIcon = 
        new Image(getClass().getResourceAsStream("联系人.png"));

    // 员工列表
    List<Employee> employees = Arrays.<Employee>asList(
            new Employee("Jacob Smith", "Accounts Department"),
            new Employee("Isabella Johnson", "Accounts Department"),           
            new Employee("Ethan Williams", "Sales Department"),
            new Employee("Emma Jones", "Sales Department"),
            new Employee("Michael Brown", "Sales Department"),
            new Employee("Anna Black", "Sales Department"),
            new Employee("Rodger York", "Sales Department"),
            new Employee("Susan Collins", "Sales Department"),
            new Employee("Mike Graham", "IT Support"),
            new Employee("Judy Mayer", "IT Support"),
            new Employee("Gregory Smith", "IT Support"));
    TreeItem<String> rootNode;

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

    // 构造函数 
    public Main() {
        // 设置第一级Item名字和图标
        this.rootNode = new TreeItem<>("MyCompany Human Resources", rootIcon);
    }

    @Override
    public void start(Stage stage) {
        // 设置为展开的,默认是关闭的
        rootNode.setExpanded(true);

        // 遍历员工
        for (Employee employee : employees) {
            // 给每个员工创建一个TreeItem
            TreeItem<String> empLeaf = new TreeItem<>(employee.getName());
            boolean found = false;
            // 遍历根节点下的单位节点
            for (TreeItem<String> depNode : rootNode.getChildren()) {
                // 查看该员工所属的单位节点是否存在了
                if (depNode.getValue().contentEquals(employee.getDepartment())){
                    // 存在折加入该员工
                    depNode.getChildren().add(empLeaf);
                    found = true;
                    break;
                }
            }
            // 不存在的话加入单位,并且在单位里加入员工
            if (!found) {
                TreeItem<String> depNode = new TreeItem<>(
                    employee.getDepartment(), 
                    new ImageView(depIcon)
                );
                rootNode.getChildren().add(depNode);
                depNode.getChildren().add(empLeaf);
            }
        }

        stage.setTitle("Tree View Sample");
        VBox box = new VBox();
        final Scene scene = new Scene(box, 400, 300);
        scene.setFill(Color.LIGHTGRAY);

        TreeView<String> treeView = new TreeView<>(rootNode);

        box.getChildren().add(treeView);
        stage.setScene(scene);
        stage.show();
    }

    // 员工类
    public static class Employee {

        // 名字和单位
        private final SimpleStringProperty name;
        private final SimpleStringProperty department;

        private Employee(String name, String department) {
            this.name = new SimpleStringProperty(name);
            this.department = new SimpleStringProperty(department);
        }

        public String getName() {
            return name.get();
        }

        public void setName(String fName) {
            name.set(fName);
        }

        public String getDepartment() {
            return department.get();
        }

        public void setDepartment(String fName) {
            department.set(fName);
        }
    }
}

为上面的程序添加新功能。修改每一行内容,添加新员工
这里写图片描述
这里写图片描述

package application;

import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.beans.property.SimpleStringProperty;
import javafx.event.ActionEvent;
import javafx.scene.layout.VBox;

public class Main extends Application {

    private final Node rootIcon = 
        new ImageView(new Image(getClass().getResourceAsStream("文件夹.png")));
    private final Image depIcon = 
        new Image(getClass().getResourceAsStream("联系人.png"));
    List<Employee> employees = Arrays.<Employee>asList(
            new Employee("Jacob Smith", "Accounts Department"),
            new Employee("Isabella Johnson", "Accounts Department"),
            new Employee("Ethan Williams", "Sales Department"),
            new Employee("Emma Jones", "Sales Department"),
            new Employee("Michael Brown", "Sales Department"),
            new Employee("Anna Black", "Sales Department"),
            new Employee("Rodger York", "Sales Department"),
            new Employee("Susan Collins", "Sales Department"),
            new Employee("Mike Graham", "IT Support"),
            new Employee("Judy Mayer", "IT Support"),
            new Employee("Gregory Smith", "IT Support"));
    TreeItem<String> rootNode;

    public static void main(String[] args) {
        Application.launch(args);
    }

    public Main() {
        this.rootNode = new TreeItem<>("MyCompany Human Resources", rootIcon);
    }

    @Override
    public void start(Stage stage) {
        rootNode.setExpanded(true);
        for (Employee employee : employees) {
            TreeItem<String> empLeaf = new TreeItem<>(employee.getName());
            boolean found = false;
            for (TreeItem<String> depNode : rootNode.getChildren()) {
                if (depNode.getValue().contentEquals(employee.getDepartment())){
                    depNode.getChildren().add(empLeaf);
                    found = true;
                    break;
                }
            }
            if (!found) {
                TreeItem<String> depNode = new TreeItem<>(
                    employee.getDepartment(), 
                    new ImageView(depIcon)
                );
                rootNode.getChildren().add(depNode);
                depNode.getChildren().add(empLeaf);
            }
        }

        stage.setTitle("Tree View Sample");
        VBox box = new VBox();
        final Scene scene = new Scene(box, 400, 300);
        scene.setFill(Color.LIGHTGRAY);

        TreeView<String> treeView = new TreeView<>(rootNode);
        // 设置为可编辑的
        treeView.setEditable(true);
        // 单元设置,TreeView下的每个子控件都支持,包扩子子控件,所以添加菜单栏那里只对有儿子有父亲的进行设置
        treeView.setCellFactory((TreeView<String> p) -> 
            new TextFieldTreeCellImpl());

        box.getChildren().add(treeView);
        stage.setScene(scene);
        stage.show();
    }

    // 对TreeView下的每个单元格进行处理
    private final class TextFieldTreeCellImpl extends TreeCell<String> {

        // 文本编辑
        private TextField textField;

        // 添加菜单
        private final ContextMenu addMenu = new ContextMenu();

        // 构造方法,如果对儿子单元有特殊的需求可以在构造方法里实现
        public TextFieldTreeCellImpl() {

            // 新增菜单栏目
            MenuItem addMenuItem = new MenuItem("Add Employee");
            addMenu.getItems().add(addMenuItem);
            addMenuItem.setOnAction((ActionEvent t) -> {
                TreeItem newEmployee = 
                    new TreeItem<>("New Employee");
                getTreeItem().getChildren().add(newEmployee);
            });
        }


        // 所有的TreeView的儿子控件都是支持Edit的,所有每次选中编辑的时候都会执行该方法
        @Override
        public void startEdit() {
            super.startEdit();

            if (textField == null) {
                // 每个单元会拥有一个文本框
                createTextField();
            }
            setText(null);
            setGraphic(textField);
            textField.selectAll();
        }

        @Override
        public void cancelEdit() {
            super.cancelEdit();
            // 清空编辑
            setText((String) getItem());
            setGraphic(getTreeItem().getGraphic());
        }

        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);

            // 为空不处理
            if (empty) {
                setText(null);
                setGraphic(null);
            } else {
                // 如果正在编辑
                if (isEditing()) {
                    if (textField != null) {
                        // 设置为原来Item的内容
                        textField.setText(getString());
                    }
                    setText(null);
                    // 设置显示为文本内容
                    setGraphic(textField);
                } else {
                    setText(getString());
                    setGraphic(getTreeItem().getGraphic());
                    // 如果有儿子  并且 有父亲,则拥有添加顾客菜单栏
                    if (!getTreeItem().isLeaf() && getTreeItem().getParent() != null) {
                        setContextMenu(addMenu);
                    }else {
                        // 其他情况没有菜单栏
                        setContextMenu(null);
                    }
                }
            }
        }

        // 创建文本区,名字为该item名
        private void createTextField() {
            textField = new TextField(getString());

            // 键盘事件处理,松开键盘时
            textField.setOnKeyReleased((KeyEvent t) -> {
                if (t.getCode() == KeyCode.ENTER) {
                    // 输入回车时,单元编辑为文本框内容
                    commitEdit(textField.getText());
                } else if (t.getCode() == KeyCode.ESCAPE) {
                    // 输入退出键时,清空编辑
                    cancelEdit();
                }
            });
        }

        // 获取该Item的名字
        private String getString() {
            return getItem() == null ? "" : getItem().toString();
        }
    }

    public static class Employee {

        private final SimpleStringProperty name;
        private final SimpleStringProperty department;

        private Employee(String name, String department) {
            this.name = new SimpleStringProperty(name);
            this.department = new SimpleStringProperty(department);
        }

        public String getName() {
            return name.get();
        }

        public void setName(String fName) {
            name.set(fName);
        }

        public String getDepartment() {
            return department.get();
        }

        public void setDepartment(String fName) {
            department.set(fName);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39778570/article/details/81277303
今日推荐