java checkbox javafx tableview

JavaFX: CheckBoxTableCell obtiene ActionEvent cuando el usuario marca un checkBox



tableview (1)

Quiero activar un método o acción cuando el usuario marca o desmarca una casilla de verificación en TableView. el coursData.addListener (...) no se activa cuando el usuario usa el checkBox.

Aquí está mi código que compila y la ventana aparece con la casilla de verificación tableView with.

package testCheckBox2; import javafx.application.Application; import javafx.beans.InvalidationListener; import javafx.beans.Observable; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ButtonBase; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.CheckBoxTableCell; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.stage.Stage; public class CheckBoxTableCellTest extends Application { private TableView<cours> tableView; public ObservableList<cours> coursData ;//= FXCollections.observableArrayList(); @Override public void start(Stage primaryStage) { this.tableView = new TableView<cours>(); final TableColumn<cours, String> Cours = new TableColumn<cours, String>("Cours"); final TableColumn<cours, Boolean> checkedCol = new TableColumn<cours, Boolean>("Checked"); this.coursData =FXCollections.observableArrayList( new cours("Analyse", "3"), new cours("Analyse TP", "4"), new cours("Thermo", "5"), new cours("Thermo TP", "7"), new cours("Chimie", "8")); tableView.setItems(this.coursData); tableView.getColumns().addAll(Cours, checkedCol); Cours.setCellValueFactory(new PropertyValueFactory<cours, String>("cours")); checkedCol.setCellValueFactory(new PropertyValueFactory<cours, Boolean>("checked")); checkedCol.setCellFactory(CheckBoxTableCell.forTableColumn(checkedCol)); checkedCol.setEditable(true); tableView.setEditable(true); final BorderPane root = new BorderPane(); root.setCenter(tableView); coursData.addListener(new InvalidationListener() { @Override public void invalidated(Observable o) { System.out.println("checkBox change state "); //Here is my problem. //When the user click on a checkBox , the method isn''t call . } }); Scene scene = new Scene(root, 300, 400); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } public static class cours { private StringProperty cours; private StringProperty coursID; private BooleanProperty checked; public cours(String cours, String coursID) { this.cours = new SimpleStringProperty(cours); this.coursID = new SimpleStringProperty(coursID); this.checked = new SimpleBooleanProperty(false); } public String getCours() { return cours.get(); } public String getCoursID() { return coursID.get(); } public boolean isChecked() { return checked.get(); } public void setCours(String cours) { this.cours.set(cours); } public void setCoursID(String coursID) { this.coursID.set(coursID); } public void setChecked(boolean checked) { this.checked.set(checked); } public StringProperty coursProperty() { return cours; } public StringProperty coursIDProperty() { return coursID; } public BooleanProperty checkedProperty() { return checked; } } }


Tiene dos formas de recibir una notificación cuando se hace clic en cualquiera de las casillas de verificación.

Uno: proporcionar una devolución de llamada como argumento para CheckBoxTableCell.forTableColumn lugar de tableColumn:

checkedCol.setCellFactory(CheckBoxTableCell.forTableColumn(new Callback<Integer, ObservableValue<Boolean>>() { @Override public ObservableValue<Boolean> call(Integer param) { System.out.println("Cours "+items.get(param).getCours()+" changed value to " +items.get(param).isChecked()); return items.get(param).checkedProperty(); } }));

Dos: proporcionar una devolución de llamada a la colección:

final List<Cours> items=Arrays.asList(new Cours("Analyse", "3"), new Cours("Analyse TP", "4"), new Cours("Thermo", "5"), new Cours("Thermo TP", "7"), new Cours("Chimie", "8")); this.coursData = FXCollections.observableArrayList(new Callback<Cours, Observable[]>() { @Override public Observable[] call(Cours param) { return new Observable[] {param.checkedProperty()}; } }); coursData.addAll(items);

y ahora escuchando los cambios en la colección:

coursData.addListener(new ListChangeListener<Cours>() { @Override public void onChanged(ListChangeListener.Change<? extends Cours> c) { while (c.next()) { if (c.wasUpdated()) { System.out.println("Cours "+items.get(c.getFrom()).getCours()+" changed value to " +items.get(c.getFrom()).isChecked()); } } } });