2014-12-27 3 views
8

У меня в настоящее время проблема с установкой CheckBoxTableCell из FXML. Я попытался преобразовать этот код в FXML:Установить CheckBoxTableCell в FXML

tableCol.setCellValueFactory(new PropertyValueFactory<Product, Boolean>("property")); 
tableCol.setCellFactory(CheckBoxTableCell.forTableColumn(toStockCol)); 

где «свойство» является лишь некоторыми атрибутами «продукт» класса (от типа «логического»). Этот код работает отлично. Теперь я пытаюсь установить это в FXML, как это:

<TableColumn text="Some Col"> 
    <cellValueFactory><PropertyValueFactory property="property" /></cellValueFactory> 
    <cellFactory><CheckBoxTableCell editable="true" /></cellFactory> 
</TableColumn> 

Это не работает, я получаю следующее сообщение об ошибке (что является FXML LoadExeption):

Caused by: java.lang.IllegalArgumentException: Unable to coerce [email protected][styleClass=cell indexed-cell table-cell check-box-table-cell]'null' to interface javafx.util.Callback. 
at com.sun.javafx.fxml.BeanAdapter.coerce(BeanAdapter.java:495) 
at com.sun.javafx.fxml.BeanAdapter.put(BeanAdapter.java:258) 
at com.sun.javafx.fxml.BeanAdapter.put(BeanAdapter.java:54) 
at javafx.fxml.FXMLLoader$PropertyElement.set(FXMLLoader.java:1409) 
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:786) 
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2827) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2536) 
... 42 more 

Я не могу понять что я делаю неправильно. Кроме того, на мой взгляд, практически нет документации о том, как установить CheckBox в TableView с FXML.

Примечание: Я хотел бы установить это из FXML, потому что это, кажется, место для этого. Я знаю, что это можно сделать с помощью контроллера FXML. Кроме того, мне просто интересно.

Любая помощь очень ценится!

ответ

5

К сожалению, CheckBoxTableCell не является фабрикой, и в пакете JavaFX не существует. Вы должны написать свой собственный завод.

public class CheckBoxTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> { 
    public TableCell<S, T> call(TableColumn<S, T> param) { 
     return new CheckBoxTableCell<S,T>(); 
    } 
} 

Затем вы можете определить столбец таблицы в файле FXML как:

<TableColumn text="Some Col"> 
    <cellValueFactory><PropertyValueFactory property="property" />  </cellValueFactory> 
    <cellFactory><CheckBoxTableCellFactory /></cellFactory> 
</TableColumn> 

Не забудьте включить CheckBoxTableCellFactory либо объявить полный путь как org.my.CheckBoxTableCellFactory или загрузчик даст вам не найденное исключение.

1

Если вам нравится управлять всем в FXML, вот как это сделать.

<TableColumn text="Married" fx:id="married"> 
<cellValueFactory> 
    <PropertyValueFactory property="married" /> 
    </cellValueFactory> 
</TableColumn> 
<fx:script> 
var myCellValue = javafx.scene.control.cell.CheckBoxTableCell.forTableColumn(married); 
married.setCellFactory(myCellValue); 
</fx:script> 

//Your data model should be exposed as below. 
private final SimpleBooleanProperty married = new  SimpleBooleanProperty(false); 
public SimpleBooleanProperty marriedProperty(){ 
    return married; 
} 
Смежные вопросы