2016-12-25 7 views
0

Возможно ли представить свойства узла с помощью метки, ComboBox (или более элементов управления) в элементе ячейки TreeView? Я хотел бы отобразить имя узла, выбранный элемент (и, если возможно, больше элементов управления (например, флажки)) в каждой ячейке treeview. Можно ли это сделать?Как отобразить свойства объекта как элементы управления в элементе одной ячейки TreeView в JavaFx?

Согласно обучающей компании 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; 
     } 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^