gpt4 book ai didi

JavaFX:当用户选中复选框时,CheckBoxTableCell 获取 ActionEvent

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:09:12 24 4
gpt4 key购买 nike

我想在用户选中或取消选中 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<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;
}
}
}

最佳答案

您可以通过两种方式在单击任何复选框时收到通知。

一:为 CheckBoxTableCell.forTableColumn 而不是 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();
}
}));

二:为集合提供回调:

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

现在监听集合中的变化:

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

关于JavaFX:当用户选中复选框时,CheckBoxTableCell 获取 ActionEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28671132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com