【问题标题】:Is it possible to add a TreeView inside a ListView是否可以在 ListView 中添加 TreeView
【发布时间】:2017-09-01 20:25:59
【问题描述】:

我希望能够单击单独 ListView 中的项目,这会将预先创建的 TreeView 添加到不同的 ListView。 这可能吗?

【问题讨论】:

    标签: java listview javafx treeview


    【解决方案1】:

    通常,直接将节点添加到虚拟化控件(如 ListView 或 TableView)的项目列表中并不是一个好主意。推荐的解决方案是将数据项添加到项目列表中,并创建将项目呈现到节点中的单元工厂。

    这是一个示例:

    import javafx.application.Application;
    import javafx.collections.*;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.layout.HBox;
    import javafx.stage.Stage;
    
    import java.io.IOException;
    
    public class TreeViewList extends Application {
        private static final int NUM_ITEMS = 10;
    
        @Override
        public void start(Stage stage) throws IOException {
            ObservableList<TreeItem<String>> items = generateItems();
    
            ListView<TreeItem<String>> sourceListView = createSourceListView(
                    items
            );
            ListView<TreeItem<String>> destListView = createDestListView(
                    sourceListView.getSelectionModel().getSelectedItems()
            );
    
            sourceListView.getSelectionModel().selectIndices(
                    3, 5, 6
            );
    
            HBox layout = new HBox(10, sourceListView, destListView);
            layout.setPadding(new Insets(10));
    
            stage.setScene(new Scene(layout));
            stage.show();
        }
    
        private ListView<TreeItem<String>> createSourceListView(
                ObservableList<TreeItem<String>> items
        ) {
            ListView<TreeItem<String>> sourceListView = new ListView<>(items);
            sourceListView.setCellFactory(param -> new ListCell<TreeItem<String>>() {
                @Override
                protected void updateItem(TreeItem<String> item, boolean empty) {
                    super.updateItem(item, empty);
    
                    if (empty
                            || item == null
                            || item.getValue() == null
                            || "".equals(item.getValue().trim())) {
                        setText(null);
                        return;
                    }
    
                    setText(item.getValue());
                }
            });
            sourceListView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
            return sourceListView;
        }
    
        private ListView<TreeItem<String>> createDestListView(
                ObservableList<TreeItem<String>> items
        ) {
            ListView<TreeItem<String>> destListView = new ListView<>(
                    items
            );
            destListView.setCellFactory(param -> new ListCell<TreeItem<String>>() {
                TreeView<String> treeView;
    
                @Override
                protected void updateItem(TreeItem<String> item, boolean empty) {
                    super.updateItem(item, empty);
    
                    if (empty
                            || item == null
                            || item.getValue() == null
                            || "".equals(item.getValue().trim())) {
                        setGraphic(null);
                        return;
                    }
    
                    if (treeView == null) {
                        treeView = new TreeView<>();
                        treeView.setPrefHeight(100);
                        treeView.setPrefWidth(100);
                    }
    
                    treeView.setRoot(item);
                    setGraphic(treeView);
                }
            });
            return destListView;
        }
    
        private ObservableList<TreeItem<String>> generateItems() {
            ObservableList<TreeItem<String>> items = FXCollections.observableArrayList();
            for (int i = 0; i < NUM_ITEMS; i++) {
                TreeItem<String> nextItem = new TreeItem<>(
                        "root-" + i
                );
    
                for (int j = 0; j < NUM_ITEMS; j++) {
                    TreeItem<String> childItem = new TreeItem<>(
                            "child-" + i + "-" +j
                    );
                    nextItem.getChildren().add(childItem);
                }
    
                items.add(nextItem);
            }
            return items;
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

      【解决方案2】:

      是的,有可能:

      创建第一个 TreeView:

      TreeItem<String> firstTreeItems = new TreeItem<>("First");
      firstTreeItems.setExpanded(false);
      for (int i = 1; i < 5; i++) {
          TreeItem<String> item = new TreeItem<> ("Item " + i);            
          firstTreeItems.getChildren().add(item);
      }        
      TreeView<String> firstTree = new TreeView<>(firstTreeItems);     
      

      现在是第二个:

      TreeItem<String> secondTreeItems = new TreeItem<>("Second");
      secondTreeItems.setExpanded(false);
      for (int i = 1; i < 5; i++) {
          TreeItem<String> item = new TreeItem<> ("Item " + i);            
          secondTreeItems.getChildren().add(item);
      }        
      TreeView<String> secondTree = new TreeView<>(secondTreeItems);     
      

      将它们添加到字符串旁边

      ListView<Object> list = new ListView<>();
      ObservableList<Object> items = FXCollections.observableArrayList ("String", "Another string", firstTree, secondTree);
      list.setItems((ObservableList<Object>) items);
      

      【讨论】:

      • 这些字符串是任何字符串还是意味着什么?
      【解决方案3】:

      是的,绝对有可能!它甚至是官方文档的一部分: https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/tree-table-view.htm

      这就是它的样子:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多