2016-12-25 3 views
0

TreeViewのセル項目のLabel、ComboBox(またはそれ以上のコントロール)によってノードのプロパティを表すことはできますか? ノードの名前、選択されたアイテム(可能であれば、より多くのコントロール(チェックボックスなど))を各ツリービューのセルに表示したいとします。 これは可能ですか?JavaFxのTreeViewの単一のセル項目にオブジェクトのプロパティをコントロールとして表示するにはどうすればよいですか?

Oracleのチュートリアル( http://docs.oracle.com/javafx/2/ui_controls/tree-view.htm)CheckBoxTreeCell、ChoiceBoxTreeCell、ComboBoxTreeCellによると、TextFieldTreeCellクラスは、同様の目的のために使用することができ

、私は、単一のセルでそれらの多くを使用する方法を見つけ出すことができない、または編集可能にする方法細胞のテンプレート。

私のモデルは次のようになります。私はこれに類似して見せたい何

public enum Options { 
    Option1, Option2, ... OptionN; 
} 

// I want to use this Node class as a TreeItem 
public class Node { 

    private Node parentNode; 
    private List<Node> childNodes; 

    // Data to be displayed and edited by using only the tree 
    private String name;   // displayed as Label 
    private Options selectedOption; // displayed as ComboBox 
    // private boolean valid;  // displayed as Checkbox 
    // these properties possibly should be JavaFX's ObjectProperty, StringProperty, ListProperty etc. 

    // ... 
} 

:ユーザーが編集することによって、ノードのプロパティを設定することができます

Node0 [ComboBox: (selectedOption = Options.OptionI)] 
|-- Node1 [ComboBox: (selectedOption = Options.OptionJ)] 
| |-- Node11 [ComboBox: (selectedOption = Options.OptionK)] 
|-- Node2 [ComboBox: (selectedOption = Options.OptionK)] 
    |-- Node21 [ComboBox: (selectedOption = Options.OptionL)] 
    |-- Node22 [ComboBox: (selectedOption = Options.OptionJ)] 

...ツリーの要素。 この機能を実現するにはどのようなアプローチをとるべきですか?

申し訳ありませんが、基本的な質問ですが、私はJavaFxを学び始めました。

+0

をこれが役に立つかもしれませんhttp://stackoverflow.com/documentation/javafx/2229/tableview/8814/customizing-tablecell-look-依存品目 – Omid

答えて

0

TreeTableViewを使用するとよいでしょう。そのControlがニーズに合わない場合は、カスタムTreeCell使用することができますしかし:

TreeView<Node> treeView = ... 
treeView.setCellFactory(t -> new TreeCell<Node>() { 

    private final ComboBox<Options> comboBox = new ComboBox<>(FXCollections.observableArrayList(Options.values())); 
    private final CheckBox valid = new CheckBox("valid"); 
    private final VBox container = new VBox(comboBox, valid); // todo: add more controls for other properties 

    private boolean swapping; 

    { 
     comboBox.valueProperty().addListener((observable, oldValue, newValue) -> { 
      if (!swapping) { 
       getItem().setSelectedOption(newValue); 
      } 
     }); 
     valid.selectedProperty().addListener((observable, oldValue, newValue) -> { 
      if (!swapping) { 
       getItem().setValid(newValue); 
      } 
     }); 

     // todo: listeners to other controls... 

     setContentDisplay(ContentDisplay.BOTTOM); 
    } 

    @Override 
    public void updateItem(Node item, boolean empty) { 
     super.updateItem(); 
     if (empty) { 
      setText(""); 
      setGraphic(null); 
     } else { 
      setText(item.getName()); 
      setGraphic(container); 
      swapping = true; 

      comboBox.setValue(item.getSelectedOption()); 
      valid.setSelected(item.isValid()); 
      // todo: initialize other nodes with item values 

      swapping = false; 
     } 
    } 
}); 
関連する問題