2016-11-06 1 views
2

Я следующий код, чтобы сделать столбец в моей TreeTableView:Заливка ComboBox с БД данных в виде табличного дерева

JFXTreeTableColumn<Employee, String> col = new JFXTreeTableColumn<>("marital status"); 
col.setPrefWidth(150); 
col.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<Employee, String>, ObservableValue<String>>() { 
    @Override 
    public ObservableValue<String> call(TreeTableColumn.CellDataFeatures<Employee, String> param) { 
     return param.getValue().getValue().getEmployee().getMaritalStatus().nameProperty(); 
    } 
}); 

MaritalStatusDAO maritalStatusDAO = new MaritalStatusDAO(); 

ObservableList<MaritalStatus> obsListMaritalStatus = FXCollections.observableArrayList(); 
obsListMaritalStatus.addAll(maritalStatusDAO.getEstadosCivis()); 

col.setCellFactory(ComboBoxTreeTableCell.forTreeTableColumn(obsListMaritalStatus)); 

Но у меня ошибка в col.setCellFactory(ComboBoxTreeTableCell.forTreeTableColumn(obsListMaritalStatus)); линии, я думаю, что ошибка происходит потому, что я сообщаю что данные таблицы будут иметь тип Employee, а в ComboBox данные должны быть типа MatrialStatus (я хочу сделать это, потому что мне нужен id элемента в ComboBox, а не только для String), и если я сделаю ObservableList<String>, он будет работать правильно, однако мне нужно, чтобы это было с объектом, так как я могу это сделать?

(я следовал этот учебник: Youtube)

EDIT: Программа не компилируется, и то, что всплывает, когда я парить над setCellFactory слово, сообщение (Если тип ObservableList является MaritalStatus) : setCellFactory(Callback<TreeTableColumn<Employee,String>,Tre‌​eTableCell<Employee,‌​String>>) in the type TreeTableColumn<Employee,String> is not applicable for the arguments (Callback<TreeTableColumn<Object,MaritalStatus>,TreeTableCel‌​l<Object,MaritalStat‌​us>>)

+2

«У меня ошибка» - есть ли трассировка стека, которую вы могли бы включить в свой пост? – avojak

+1

Вы импортируете 'javafx.scene.control.cell.ComboBoxTreeTableCell'? – avojak

+1

Не могли бы вы изменить свой вопрос, чтобы включить это сообщение об ошибке, так как это действительно вопрос, который пытается решить? – avojak

ответ

1

Я не очень хорошо знаком с JavaFX, однако я могу попытаться устранить ошибку компиляции, которую вы получаете.

Вы начинаете с final TreeTableColumn<Employee, String> col. В документации к TreeTableColumn мы получаем объяснение параметров типа:

...final TreeTableColumn<S, T>... 
Type Parameters: 
    <S> The type of the TableView generic type (i.e. S == TableView<S>) 
    <T> The type of the content in all cells in this TableColumn. 

В коде, который вы выбрали Employee быть TableView общего типа (т.е. S.), А также String в качестве типа для содержимого в каждой ячейке столбца (то есть T).

Кроме того, в вашем анонимной Callback реализации, вы правильно использовали Employee и String как в TableView и TreeTableColumn типов соответственно, и так далее.

Переходя к месту неисправности, взгляните на метод подписи forTreeTableColumn:

public static <S,T> Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> forTreeTableColumn(
     final ObservableList<T> items) 

... где T является «тип элементов, содержащихся в TreeTableColumn.» - в вашем случае это String.

Именно поэтому, когда вы меняете параметризованный тип вашего ObservableList на String, ошибка исчезает.

Если тип этой колонки действительно должны быть MaritalStatus, как вы упомянули, то вам также нужно исправить типы на TreeTableColumn, CellDataFeatures и т.д., так что T является MaritalStatus и не String:

TreeTableColumn<Employee, MaritalStatus> col = new TreeTableColumn<>("marital status"); 
col.setPrefWidth(150); 
col.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<Employee, MaritalStatus>, ObservableValue<MaritalStatus>>() { 
    @Override 
    public ObservableValue<MaritalStatus> call(TreeTableColumn.CellDataFeatures<Employee, MaritalStatus> param) { 
     // Probably won't compile here now because the type of 'param' has changed 
     return param.getValue().getValue().getEmployee().getMaritalStatus().nameProperty(); 
    } 
}); 

MaritalStatusDAO maritalStatusDAO = new MaritalStatusDAO(); 

ObservableList<MaritalStatus> obsListMaritalStatus = FXCollections.observableArrayList(); 
obsListMaritalStatus.addAll(maritalStatusDAO.getEstadosCivis()); 

col.setCellFactory(ComboBoxTreeTableCell.forTreeTableColumn(obsListMaritalStatus)); 

Я не смотрел весь учебник, который вы связали, но, надеюсь, это поможет объяснить, почему и как вы можете использовать ObservableList<MaritalStatus> вместо ObservableList<String>.

Я указал, что вы, скорее всего, получите ошибку компиляции внутри метода call. Тип параметра изменился, поэтому вам нужно будет переоценить, что нужно сделать внутри метода, чтобы вернуть объект нового ожидаемого типа (Observable<MaritalStatus>).

Опять же, я не уверен, что это будет функционально достигать того, что вы ищете, но оно должно заставить вас двигаться в правильном направлении с точки зрения использования дженериков здесь.

Посмотрите на Oracle's Java Documentation on generics для лучшего объяснения того, как общие типы работают на Java.

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