2014-12-27 11 views
8

Mam obecnie problem z ustawieniem CheckBoxTableCell z FXML. Próbowałem przekonwertować ten kod do FXML:Zestaw CheckBoxTableCell w FXML

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

gdzie „własność” to tylko niektóre z atrybutów klasy „produkt” (z rodzaju „logiczną”). Ten kod działa poprawnie. I teraz spróbuj ustawić to w FXML, tak:

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

ten nie działa, pojawia się następujący błąd (który jest 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 

nie mogę zrozumieć co robię źle. Ponadto, moim zdaniem, istnieje niewielka dokumentacja dotycząca ustawiania CheckBox w TableView z FXML.

Uwaga: Chciałbym ustawić to z FXML, ponieważ wydaje się, że jest to miejsce na to. Wiem, że można to zrobić za pomocą kontrolera FXML. Jestem też ciekawy.

Każda pomoc jest bardzo doceniana!

Odpowiedz

5

Niestety CheckBoxTableCell nie jest fabryką i nie ma dostępnej w pakiecie JavaFX. Musisz napisać własną fabrykę.

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

Następnie można zdefiniować kolumnę tabeli w pliku FXML jak:

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

Nie zapomnij dołączyć CheckBoxTableCellFactory albo zadeklarować pełną ścieżkę jak org.my.CheckBoxTableCellFactory lub ładowarka daje nie znaleziono wyjątku.

1

Jeśli chcesz zarządzać wszystkim w FXML, oto jak to zrobić.

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