/ / Définit CheckBoxTableCell dans FXML - case à cocher, javafx, tableview, javafx-8, fxml

Définissez CheckBoxTableCell dans FXML - case à cocher, javafx, tableview, javafx-8, fxml

J'ai actuellement un problème avec la définition d'un CheckBoxTableCell à partir du FXML. J'ai essayé de convertir ce code en FXML:

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

où "propriété" est juste un attribut de la classe "Product" (du type "boolean"). Ce code fonctionne bien. J'essaie maintenant de définir ceci dans le FXML, comme ceci:

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

Cela ne fonctionne pas, j’obtiens l’erreur suivante (qui est un LoadExeption FXML):

Caused by: java.lang.IllegalArgumentException: Unable to coerce CheckBoxTableCell@24d62d1e[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

Je ne peux pas comprendre ce que je fais mal. En outre, à mon avis, il existe peu de documentation sur la définition d'un CheckBox dans un TableView avec FXML.

Note: Je voudrais définir ceci à partir du FXML, parce que cela semble être l'endroit idéal pour cela. Je sais que cela peut être fait avec le contrôleur FXML. Aussi, je suis juste curieux.

Toute aide est grandement appréciée!

Réponses:

5 pour la réponse № 1

Malheureusement CheckBoxTableCell n’est pas une fabrique et aucune n’est disponible dans le package JavaFX. Vous devez écrire votre propre usine.

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

Ensuite, vous pouvez définir votre colonne de table dans le fichier FXML comme suit:

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

N'oubliez pas d'inclure le CheckBoxTableCellFactory ou bien de déclarer le chemin complet comme org.my.CheckBoxTableCellFactory ou le chargeur vous donnera une exception non trouvée.


1 pour la réponse № 2

Si vous aimez gérer tout ce qui est dans FXML, voici comment le faire.

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