Obtenez Case valeur dans un tableau en JavaFX
J'ai une table et il a une colonne avec des cases à cocher.
Sur un clic sur un bouton, je veux savoir qui les cases sont cochées et qui ne le sont pas.
Jusqu'à présent j'ai réussi à créer des cases à cocher dans un tableau.
Le code est comme suit.
public class TTEs implements Initializable {
@FXML
private TableView<TestObject> tableReport;
@FXML
private TableColumn<TestObject, String> name;
@FXML
private TableColumn<TestObject, Boolean> checkbox;
@FXML
public void getValues() {
//the method will get what check boxes are checked (this part is the problem)
}
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
ObservableList<TestObject> data = FXCollections.observableArrayList();
data.add(new TestObject("Test 1", true));
data.add(new TestObject("Test 2", false));
tableReport.setItems(data);
name.setCellValueFactory(new PropertyValueFactory<TestObject, String>("name"));
checkbox.setCellValueFactory(new PropertyValueFactory<TestObject, Boolean>("checked"));
checkbox.setCellFactory(new Callback<TableColumn<TestObject, Boolean>,
TableCell<TestObject, Boolean>>() {
public TableCell<TestObject, Boolean> call(TableColumn<TestObject, Boolean> p) {
return new CheckBoxTableCell<TestObject, Boolean>();
}
});
}
//CheckBoxTableCell for creating a CheckBox in a table cell
public static class CheckBoxTableCell<S, T> extends TableCell<S, T> {
private final CheckBox checkBox;
private ObservableValue<T> ov;
public CheckBoxTableCell() {
this.checkBox = new CheckBox();
this.checkBox.setAlignment(Pos.CENTER);
setAlignment(Pos.CENTER);
setGraphic(checkBox);
}
@Override public void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
setGraphic(checkBox);
if (ov instanceof BooleanProperty) {
checkBox.selectedProperty().unbindBidirectional((BooleanProperty) ov);
}
ov = getTableColumn().getCellObservableValue(getIndex());
if (ov instanceof BooleanProperty) {
checkBox.selectedProperty().bindBidirectional((BooleanProperty) ov);
}
}
}
}
}
Quand je debug, je trouve que:
ov = getTableColumn().getCellObservableValue(getIndex());
if (ov instanceof BooleanProperty) {
checkBox.selectedProperty().bindBidirectional((BooleanProperty) ov);
}
Dans la condition ci-dessus, il ne va jamais à l'intérieur de la if
déclaration, ce qui signifie que le ov
n'est pas une instance de BooleanProperty
. Mais lorsque j'imprime la classe de ov
,
System.out.println(ov.getClass().getName());
il imprime comme
javafx.beans.property.ReadOnlyObjectWrapper
ReadOnlyObjectWrapper
est une sous-classe de BooleanProperty
, alors pourquoi est le instanceof
le contrôle n'a pas de travail?
- Double - stackoverflow.com/questions/13459936/...
- Nono, c'est en java swing. Ma demande est à l'aide de javaFX. Il y a beaucoup de différence.
- gotozero réponse ci-dessous a travaillé pour moi et m'a pris environ une minute à mettre en œuvre. Aucune modification de code nécessaire si vous utilisez fxml.
- si vous souhaitez vérifier les sous-classes que vous pouvez utiliser
if (BooleanProperty.class.isAssignableFrom(myObject.getClass()))
Vous devez vous connecter pour publier un commentaire.
Testé sur Java 8.
Seulement 4 choses simples.
1) Faire CheckBoxCellFactory classe. Mettre quelque part dans votre projet.
2) Votre modèle de classe. Personne par exemple.
3) Faites des modifications dans votre fichier fxml. La section de votre TableView -> TableColumn vas ressembler à ceci:
4) Si vous voulez faire de votre case étant modifiable
Mise en œuvre dans les binaires sur SF et de la source sur GitHub
checkBoxTableColumn.setCellValueFactory(cellData -> cellData.getValue().checkedProperty()); checkBoxTableColumn.setCellFactory(param -> new CheckBoxTableCell<Person, Boolean>());
Boucle à travers le modèle de données de votre
TableView
la vérification de la valeur booléenne qui est lié à chaqueCheckBox
.`
Le principal problème avec votre approche est la CheckBoxTableCell utilisation:
Une Cellule est un très réutilisés 'rendu' de la machine. Si vous essayez d'ajouter un état, comme la Case de la variable, vous êtes en difficulté.
Le plus de solution simple à votre problème est de répartir la case à cocher à chaque fois. Le code suivant fournit un travail de colonne de cases à cocher:
Comme le bidirectionnel de la propriété de liaison est une faible liaison, carbage collection de fonctionner correctement même si vous êtes incapable de séparer explicitement.
La décoché fonte à BooleanProperty n'est pas un bon style, de toute façon, ici, désolé.
Envisager d'accéder à l'ensemble de l'objet à l'aide de:
par le chemin: le birdeirectional de liaison ne sera PAS définir la propriété sélectionnée en ce moment, seulement si il est modifié par la suite! donc, de manière explicite de la mission:
est obligatoire ici.
Un peu hors sujet mais dans le Kotlin vous pouvez faire ceci:
C'est tout là est à lui
Dans la méthode initialize, allumez votre personnalisée en usine pour celui fourni par JavaFX:
Maintenant vos données est lié à la colonne, et vous pouvez effectuer une itération sur les éléments et vérifier pour le champ "coché":