JavaFX:CheckBoxTableCell在用户检查checkBox时获取ActionEvent

我想在用户选中或取消选中tableView中的复选框时触发方法或操作。 当用户使用checkBox时,不会触发coursData.addListener(…)。

这是我编译的代码,窗口显示带有复选框的tableView。

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 tableView; public ObservableList coursData ;//= FXCollections.observableArrayList(); @Override public void start(Stage primaryStage) { this.tableView = new TableView(); final TableColumn Cours = new TableColumn("Cours"); final TableColumn checkedCol = new TableColumn("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")); checkedCol.setCellValueFactory(new PropertyValueFactory("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; } } } 

单击任何复选框时,您有两种方式获取通知。

一:提供回调作为CheckBoxTableCell.forTableColumn而不是tableColumn的参数:

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

二:提供对集合的回调:

 final List 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() { @Override public Observable[] call(Cours param) { return new Observable[] {param.checkedProperty()}; } }); coursData.addAll(items); 

现在听集合中的变化:

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