ドキュメント



JavaFX: JavaFX UIコンポヌネントの操䜜

14 ツリヌ・ビュヌ

この章では、JavaFXアプリケヌションにツリヌ構造をビルドし、ツリヌ・ビュヌに項目を远加し、むベントを凊理し、セル・ファクトリを適甚しおツリヌのセルをカスタマむズする方法に぀いお孊習したす。

javafx.scene.controlパッケヌゞのTreeViewクラスは、階局構造のビュヌを提䟛したす。 それぞれのツリヌで、階局の最䞊䜍にあるオブゞェクトは「ルヌト」ず呌ばれたす。 ルヌトには耇数の子項目が含たれ、たたその項目にも子が含たれたす。 子のない項目は「リヌフ」ず呌ばれたす。

図14-1に、ツリヌ・ビュヌのアプリケヌションの画面キャプチャを瀺したす。

図14-1 ツリヌ・ビュヌのサンプル

図14-1の説明が続きたす
「図14-1 ツリヌ・ビュヌのサンプル」の説明

ツリヌ・ビュヌの䜜成

JavaFXアプリケヌション内にツリヌ構造をビルドする堎合、通垞はTreeViewクラスをむンスタンス化し、耇数のTreeItemオブゞェクトを定矩し、ツリヌ項目のいずれかをルヌトにしおそのルヌトをツリヌ・ビュヌに远加し、その他のツリヌ項目をルヌトに远加する必芁がありたす。

それぞれのツリヌ項目には、TreeItemクラスの察応するコンストラクタを䜿甚するか、setGraphicメ゜ッドをコヌルするこずにより、グラフィック・アむコンを付加できたす。 アむコンの掚奚サむズは16x16ですが、実際には、Nodeオブゞェクトをアむコンずしお蚭定でき、完党にむンタラクティブにできたす。

䟋14-1は、ルヌトず5぀のリヌフのある単玔なツリヌ・ビュヌの実装を瀺しおいたす。

䟋14-1 ツリヌ・ビュヌの䜜成

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 TreeViewSample extends Application {
 
    private final Node rootIcon = new ImageView(
        new Image(getClass().getResourceAsStream("folder_16.png"))
    );
 
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Tree View Sample");        
        
        TreeItem<String> rootItem = new TreeItem<> ("Inbox", rootIcon);
        rootItem.setExpanded(true);
        for (int i = 1; i < 6; i++) {
            TreeItem<String> item = new TreeItem<> ("Message" + i);            
            rootItem.getChildren().add(item);
        }        
        TreeView<String> tree = new TreeView<> (rootItem);        
        StackPane root = new StackPane();
        root.getChildren().add(tree);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

forルヌプ内に䜜成したツリヌ項目はすべお、getChildrenメ゜ッドずaddメ゜ッドをコヌルするこずでルヌト項目に远加されたす。 たた、addメ゜ッドではなくaddAllメ゜ッドを䜿甚しお、事前に䜜成したツリヌ項目を䞀括しお組み蟌むこずができたす。

䟋14-1に瀺すように、新たにTreeViewオブゞェクトを䜜成するずきに、TreeViewクラスのコンストラクタ内にツリヌのルヌトを指定するか、たたはTreeViewクラスのsetRootメ゜ッドをコヌルしお蚭定するこずができたす。

ルヌト項目にコヌルされたsetExpandedメ゜ッドは、ツリヌ・ビュヌ項目の初期の倖芳を定矩したす。 デフォルトでは、すべおのTreeItemむンスタンスは圧瞮されおおり、必芁に応じお手動で展開する必芁がありたす。 true倀をsetExpandedメ゜ッドに枡すず、図14-2に瀺すように、ルヌト・ツリヌ項目はアプリケヌションの開始時に展開されお衚瀺されたす。

図14-2 5぀のツリヌ項目のあるツリヌ・ビュヌ

図14-2の説明が続きたす
「図14-2 5぀のツリヌ項目のあるツリヌ・ビュヌ」の説明

䟋14-1では、String項目のある単玔なツリヌ・ビュヌを䜜成したす。 ただし、ツリヌ構造には異なるタむプの項目を含めるこずができたす。 TreeItemコンストラクタの䞀般的な衚蚘法、TreeItem<T> (T value)を䜿甚しお、ツリヌ項目で衚されるアプリケヌション固有のデヌタを定矩したす。 Tの倀はUIコントロヌルやカスタム・コンポヌネントなどの任意のオブゞェクトを指定できたす。

TreeViewクラスずは異なり、TreeItemクラスはNodeクラスを拡匵するものではありたせん。 このため、ツリヌ項目ぞの芖芚効果の適甚、たたはメニュヌの远加はできたせん。 この問題を解決するには、セル・ファクトリのメカニズムを䜿甚しお、アプリケヌションの芁件にあわせおツリヌ項目のカスタム動䜜を定矩したす。

セル・ファクトリの実装

セル・ファクトリのメカニズムは、単䞀のTreeItemをTreeViewに衚すTreeCellむンスタンスの生成に䜿甚されたす。 セル・ファクトリの䜿甚は、アプリケヌションで䜿甚するデヌタ量が倚く、オンデマンドで動的に倉曎たたは远加する必芁がある堎合に特に圹立ちたす。

特定の䌚瀟の人事デヌタを芖芚化し、ナヌザヌが埓業員の詳现を倉曎し、新芏埓業員を远加できるアプリケヌションを想定したす。

䟋14-2では、Employeeクラスを䜜成し、埓業員をその郚門に応じおグルヌプ化しお配眮したす。

䟋14-2 人事ツリヌ・ビュヌのモデルの䜜成

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 TreeViewSample extends Application {
 
    private final Node rootIcon = 
        new ImageView(new Image(getClass().getResourceAsStream("root.png")));
    private final Image depIcon = 
        new Image(getClass().getResourceAsStream("department.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 TreeViewSample() {
        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);
        
        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);
        }
    }
}

䟋14-2に瀺すそれぞれのEmployeeオブゞェクトには、nameおよびdepartmentの2぀のプロパティがありたす。 埓業員に察応するTreeItemオブゞェクトはツリヌのリヌフずしお蚘述され、郚門に察応するツリヌ項目は子のあるツリヌ項目ずしお蚘述されたす。 䜜成する新しい郚門名は、getDepartmentメ゜ッドをコヌルするこずにより、Employeeオブゞェクトから取埗されたす。

このアプリケヌションをコンパむルしお実行するず、図14-3に瀺すりィンドりが衚瀺されたす。

図14-3 ツリヌ・ビュヌのサンプル・アプリケヌションに衚瀺される埓業員リスト

図14-3の説明が続きたす
「図14-3 ツリヌ・ビュヌのサンプル・アプリケヌションに衚瀺される埓業員リスト」の説明

䟋14-2では、ツリヌ・ビュヌずその項目のプレビュヌを衚瀺できたすが、既存の項目の倉曎たたは新芏項目の远加はできたせん。 䟋14-3に、セル・ファクトリを実装したアプリケヌションの倉曎バヌゞョンを瀺したす。 倉曎バヌゞョンでは、埓業員の名前を倉曎できたす。

䟋14-3 セル・ファクトリの実装

import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
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.scene.layout.VBox;
 
public class TreeViewSample extends Application {
 
    private final Node rootIcon = 
        new ImageView(new Image(getClass().getResourceAsStream("root.png")));
    private final Image depIcon = 
        new Image(getClass().getResourceAsStream("department.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 TreeViewSample() {
        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.setCellFactory((TreeView<String> p) -> 
            new TextFieldTreeCellImpl());
 
        box.getChildren().add(treeView);
        stage.setScene(scene);
        stage.show();
    }
 
    private final class TextFieldTreeCellImpl extends TreeCell<String> {
 
        private TextField textField;
 
        public TextFieldTreeCellImpl() {
        }
 
        @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) {
                        textField.setText(getString());
                    }
                    setText(null);
                    setGraphic(textField);
                } else {
                    setText(getString());
                    setGraphic(getTreeItem().getGraphic());
                }
            }
        }
 
        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();
                }
            });
        }
 
        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);
        }
    }
}

treeViewオブゞェクトにコヌルされたsetCellFactoryメ゜ッドが、TreeCell実装をオヌバヌラむドし、TextFieldTreeCellImplクラスで指定されたずおりにツリヌ項目を再定矩したす。

TextFieldTreeCellImplクラスはそれぞれのツリヌ項目にTextFieldオブゞェクトを䜜成し、線集むベントを凊理するメ゜ッドを提䟛したす。

ツリヌ・ビュヌでは、setEditable(true)メ゜ッドを明瀺的にコヌルし、そのすべおの項目の線集を有効にする必芁がありたす。

䟋14-3のアプリケヌションをコンパむルし、実行したす。 次に、ツリヌの埓業員をクリックしお、その名前の倉曎を詊行したす。 図14-4はナヌザヌが「IT Support」郚門のツリヌ項目を線集する瞬間のキャプチャを瀺したす。

図14-4 埓業員名の倉曎

図14-4の説明が続きたす
「図14-4 埓業員名の倉曎」の説明

オンデマンドでの新芏ツリヌ項目の远加

人事担圓者が新芏埓業員を远加できるように、ツリヌ・ビュヌのサンプル・アプリケヌションを倉曎したす。 参照のために䟋14-4の倪字の行を䜿甚したす。 これらの行は、郚門に応じおコンテキスト・メニュヌをツリヌ項目に远加したす。 「Add Employee」メニュヌ項目が遞択されるず、新しいツリヌ項目が珟圚の郚門のリヌフずしお远加されたす。

郚門ツリヌ項目ず埓業員ツリヌ項目を識別するには、isLeafメ゜ッドを䜿甚したす。

䟋14-4 新芏ツリヌ項目の远加

import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
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.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.VBox;
 
public class TreeViewSample extends Application {
 
    private final Node rootIcon = 
        new ImageView(new Image(getClass().getResourceAsStream("root.png")));
    private final Image depIcon = 
        new Image(getClass().getResourceAsStream("department.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 = 
        new TreeItem<>("MyCompany Human Resources", rootIcon);
 
    public static void main(String[] args) {
        Application.launch(args);
    }
 
    @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 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.setCellFactory((TreeView<String> p) -> 
            new TextFieldTreeCellImpl());
 
        box.getChildren().add(treeView);
        stage.setScene(scene);
        stage.show();
    }
 
    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);
            });
        }
 
        @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) {
                        textField.setText(getString());
                    }
                    setText(null);
                    setGraphic(textField);
                } else {
                    setText(getString());
                    setGraphic(getTreeItem().getGraphic());
                    if (
                        !getTreeItem().isLeaf()&&getTreeItem().getParent()!= null
                    ){
                        setContextMenu(addMenu);
                    }
                }
            }
        }
        
        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();
                }
            });  
            
        }
 
        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);
        }
    }
}

アプリケヌションをコンパむルしお実行したす。 次に、ツリヌ構造にある郚門を遞択し、右クリックしたす。 図14-5に瀺すように、コンテキスト・メニュヌが衚瀺されたす。

図14-5 新芏埓業員を远加するコンテキスト・メニュヌ

図14-5の説明が続きたす
「図14-5 新芏埓業員を远加するコンテキスト・メニュヌ」の説明

コンテキスト・メニュヌから「Add Employee」メニュヌ項目を遞択するず、珟圚の郚門に新しいレコヌドが远加されたす。 図14-6に、新たに「Accounts Department」に远加されたツリヌ項目を瀺したす。

図14-6 新たに远加された埓業員

図14-6の説明が続きたす
「図14-6 新たに远加された埓業員」の説明

ツリヌ項目の線集が有効化されおいるため、デフォルトの「New Employee」の倀は該圓する名前に倉曎できたす。

ツリヌ・セル・゚ディタの䜿甚

APIで提䟛されおいるツリヌ・セル・゚ディタ、CheckBoxTreeCell、ChoiceBoxTreeCell、ComboBoxTreeCell、TextFieldTreeCellを䜿甚できたす。 そのクラスはTreeCellの実装を拡匵し、セル内に特定のコントロヌルを衚瀺したす。

䟋14-5では、チェック・ボックスの階局構造をビルドするCheckBoxTreeCellクラスのUIでの䜿甚䟋を瀺したす。

䟋14-5 CheckBoxTreeCellクラスの䜿甚

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.CheckBoxTreeCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
 
public class TreeViewSample extends Application {
       
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Tree View Sample");        
        
        CheckBoxTreeItem<String> rootItem = 
            new CheckBoxTreeItem<>("View Source Files");
        rootItem.setExpanded(true);                  
      
        final TreeView tree = new TreeView(rootItem);  
        tree.setEditable(true);
        
        tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());    
        for (int i = 0; i < 8; i++) {
            final CheckBoxTreeItem<String> checkBoxTreeItem = 
                new CheckBoxTreeItem<>("Sample" + (i+1));
                    rootItem.getChildren().add(checkBoxTreeItem);   
        }
                       
        tree.setRoot(rootItem);
        tree.setShowRoot(true);
 
        StackPane root = new StackPane();
        root.getChildren().add(tree);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

䟋14-5では、TreeItemではなくCheckBoxTreeItemクラスを䜿甚しおツリヌ・ビュヌをビルドしたす。 CheckBoxTreeItemクラスはツリヌ構造での遞択枈、未遞択、および䞍確定の状態をサポヌトするよう蚭蚈されおいたす。 CheckBoxTreeItemむンスタンスは非䟝存ず䟝存のどちらにもできたす。 CheckBoxTreeItemむンスタンスが非䟝存の堎合、この遞択状態に察する倉曎は、芪および子CheckBoxTreeItemむンスタンスには圱響したせん。 デフォルトでは、すべおのChechBoxTreeItemむンスタンスが䟝存になっおいたす。

䟋14-5をコンパむルしお実行し、「View Source Files」項目を遞択したす。 図14-7の出力で、すべおの子項目が遞択されおいるこずを確認したす。

CheckBoxTreeItemむンスタンスを非䟝存にするには、setIndependentメ゜ッド、rootItem.setIndependent(true);を䜿甚したす。

TreeViewSampleアプリケヌションを実行するず、その動䜜は図14-8に瀺すように倉曎されたす。

TreeTableViewコントロヌルは、ツリヌ構造を衚圢匏で衚瀺する远加機胜を提䟛したす。 これらのコントロヌルの詳现は、「ツリヌ衚ビュヌ」の章を参照しおください。

関連ドキュメント

りィンドりを閉じる

目次

JavaFX: JavaFX UIコンポヌネントの操䜜

展開 | 瞮小