2017-08-04 71 views
1

我需要在JavaFX 8中具有可擴展的可嵌套鍵值列表。這與TreeTableView的功能類似,但它是垂直定向的,而不是水平定向的。換句話說,行將是標題而不是X-Y倒置軸表的列。由於TreeTableView是水平的限制,我開始探索TreeView的選項。 TreeView很好地工作,但只有一列,我需要在每一行中的鍵值對。我真正需要的是類似下面的東西:有兩列的TreeView JavaFX 8

example

注意foobar可以是唯一的。

如何將第二列添加到TreeView

+0

你的意思是'TreeTableView'?你可以添加一個你想要的樣子嗎? – user1803551

+0

@ user1803551是的! – beepboop

+0

@ user1803551添加圖片示例。 – beepboop

回答

0

這是一個基於定製單元工廠TreeView創建類似行的單元的想法。創建一個自定義單元格,其中包含網格中的2個標籤和一些調整大小的行爲設置。

enter image description here

public class CustomTree extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     TreeView<String[]> tree = new TreeView<>(); 

     tree.setCellFactory(cell -> new TreeCell<String[]>() { 

      private GridPane pane = new GridPane(); 
      private Label keyLabel = new Label(); 
      private Label valueLabel = new Label(); 
      private Border keyBorder = new Border(
        new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0.5, 0.5, 0.5, 1))); 
      private Border valueBorder = new Border(
        new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0.5, 1, 0.5, 0.5))); 

      { 
       pane.getChildren().addAll(keyLabel, valueLabel); 
       GridPane.setConstraints(keyLabel, 0, 0); 
       GridPane.setConstraints(valueLabel, 1, 0); 

       ColumnConstraints column1 = new ColumnConstraints(); 
       column1.setPercentWidth(50); 
       ColumnConstraints column2 = new ColumnConstraints(); 
       column2.setPercentWidth(50); 
       pane.getColumnConstraints().addAll(column1, column2); 

       keyLabel.setBorder(keyBorder); 
       valueLabel.setBorder(valueBorder); 
       keyLabel.setMaxWidth(Double.MAX_VALUE); 
       valueLabel.setMaxWidth(Double.MAX_VALUE); 

       setPadding(Insets.EMPTY); 
      } 

      @Override 
      public void updateItem(String[] name, boolean empty) { 
       super.updateItem(name, empty); 
       if (empty || name == null) { 
        setText(null); 
        setGraphic(null); 
       } else { 
        keyLabel.setText(name[0]); 
        valueLabel.setText(name[1]); 
        setGraphic(pane); 
       } 
      } 
     }); 

     TreeItem<String[]> root = new TreeItem<>(new String[] { "", "" }); 
     TreeItem<String[]> sub1 = new TreeItem<>(new String[] { "Foo", "Bar" }); 
     TreeItem<String[]> sub2 = new TreeItem<>(new String[] { "Foo", "Bar" }); 
     TreeItem<String[]> sub3 = new TreeItem<>(new String[] { "Foo", "Bar" }); 
     TreeItem<String[]> sub4 = new TreeItem<>(new String[] { "Foo", "" }); 
     TreeItem<String[]> sub5 = new TreeItem<>(new String[] { "Foo", "Bar" }); 
     TreeItem<String[]> sub41 = new TreeItem<>(new String[] { "Foo", "Bar" }); 
     TreeItem<String[]> sub42 = new TreeItem<>(new String[] { "Foo", "Bar" }); 
     root.getChildren().addAll(sub1, sub2, sub3, sub4, sub5); 
     sub4.getChildren().addAll(sub41, sub42); 

     tree.setRoot(root); 

     Scene scene = new Scene(tree); 
     stage.setScene(scene); 
     stage.show(); 
    } 

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

注意,根也必須使用這種細胞類型,雖然它可能隱藏完全使用tree.setShowRoot(false);根。這種方法的兩個缺點是每個單元的行爲都是一個單元 - 沒有列的概念,並且單元的值是以數組的形式給出的,因此失去了類型安全性。你可以自己擴展這個例子。

雖然使用(通用)TableViewTreeTableView方法可能有很多工作。