2014-12-27 5 views
8

Ich habe derzeit ein Problem mit einer CheckBoxTableCell aus der FXML. Ich habe versucht, diesen Code zu FXML konvertieren:Set CheckBoxTableCell in FXML

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

wo ‚Eigenschaft‘ nur Klasse einige Attribut des ‚Produkt‘ ist (vom Typ ‚boolean‘). Dieser Code funktioniert gut. Ich nun versuchen, dies in der FXML zu setzen, wie folgt aus:

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

Das funktioniert nicht, ich die folgende Fehlermeldung erhalten (das ist ein 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 

Ich verstehe nicht, aus was ich falsch mache. Meiner Meinung nach gibt es wenig oder gar keine Dokumentation darüber, wie man eine CheckBox in einem TableView mit FXML setzt.

Hinweis: Ich möchte dies von der FXML einstellen, weil es scheint, der Ort dafür zu sein. Ich weiß, dass dies mit dem FXML-Controller gemacht werden kann. Ich bin auch nur neugierig.

Jede Hilfe wird sehr geschätzt!

Antwort

5

Leider CheckBoxTableCell ist keine Fabrik, und es gibt keine im JavaFX-Paket. Sie müssen Ihre eigene Fabrik schreiben.

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>(); 
    } 
} 

Dann können Sie Ihre Tabellenspalte in der FXML Datei als definieren:

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

Nicht vergessen die CheckBoxTableCellFactory aufzunehmen oder auch den vollständigen Pfad wie org.my.CheckBoxTableCellFactory oder der Lader Sie zu erklären geben eine nicht gefundene Ausnahme.

1

Wenn Sie alle in FXML verwalten möchten, hier ist, wie es geht.

<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; 
}