gpt4 book ai didi

JavaFX CheckBoxTableCell 捕获 ClickEvent

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:58 24 4
gpt4 key购买 nike

TableView 中使用 CheckBoxTableCell 我不想在用户单击复选框时执行某些代码。此代码需要在检查 CheckBox 之前以及更改关联的属性之前执行。

由于 CheckBoxTableCell 不会触发 startEdit()commitEdit() 等,因此我需要另一个可以放置代码的位置。

updateItem() 会来不及了,因为那里的值已经改变了。

有人知道我可以插入代码的其他地方吗?还是我最好只编写自己的 CheckBoxTableCell?

对于那些想进一步思考的人:当用户选中复选框时,我想运行一个代码来检查他的决定是否会在以后给他带来问题。当属性更改时,我有一个将新值上传到数据库的 changeListener。如果可能有任何问题(我的代码返回 true),那么应该有强制性的错误消息:“你真的想这样做......blabla”并且只有当他确认应该实际检查复选框时,值才会改变并上传到数据库。

这就是我设置 CheckBoxTableCell 的方式:

    //init cell factories
Callback<TableColumn<PublicMovie, Boolean>, TableCell<PublicMovie, Boolean>> checkBoxCellFactory
= (TableColumn<PublicMovie, Boolean> p) -> new CheckBoxTableCell<>();
//Assign Column
allMoviesCheckBoxColumn = (TableColumn<PublicMovie, Boolean>) allMoviesTableView.getColumns().get(0);
//Set CellValueFactory
allMoviesCheckBoxColumn.setCellValueFactory(cellData -> cellData.getValue().getSomeBooleanProperty();

someBooleanProperty 有一个监听器。当更改为 true 时,statusProperty 更改为 1

此代码片段位于 TableView 基础类的构造函数中。每当用户单击 CheckBox 时,它就会被执行。

    this.status.addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
DataHandler.fireOnChangedEvent(PublicMovieChangeListener.STATUS_CHANGED, getMovie(), newValue, oldValue);
});

DataHandler 包含一个 Listeners 列表(到目前为止只有一个)。当 DataHandler 调用 onChange 事件时执行以下代码:

@Override
public void onChange(int changeID, PublicMovie changedPublicMovie, Object newValue, Object oldValue) {
switch (changeID) {
case STATUS_CHANGED:
boolean mayUpdate = check();
//check is a placeholder for the code that checks for problems.
//It will return false if there might be a problem.

if(!mayUpdate){
mayUpdate = ErrorDialogs.getConfirmationDialog("Überfüllung!", header, content);
}
if (mayUpdate) {
updateMovie(changedPublicMovie);
} else {
changedPublicMovie.getStatusProperty().set((int) oldValue);
refreshAllMoviesTable();
}
break;
case THREE_DIM_CHANGED:
updateMovie(changedPublicMovie);
break;
case CHILDREN_CHANGED:
updateMovie(changedPublicMovie);
break;
}

您在这里看到的是我试图撤销已更改的属性...但该复选框仍处于选中状态。因此,我正在寻找一种在更改属性之前执行检查的方法。

最佳答案

基于 CheckBoxTableCell 的文档:

If you want to be notified of changes, it is recommended to directly observe the boolean properties that are manipulated by the CheckBox.

我并不是说使用 CheckBoxTableCell 是不可能的,但很可能不是那么简单。

在大多数情况下,可以使用 EventFilter 来管理这种“预选”事件。

因此,您可以尝试将普通的 TableColumn 与使用这些 EventFilter 的适当 cellFactory 一起使用。

我的例子

使用的cellFactory:

tableCol.setCellFactory(p -> {
CheckBox checkBox = new CheckBox();
TableCell<Person, Boolean> tableCell = new TableCell<Person, Boolean>() {

@Override
protected void updateItem(Boolean item, boolean empty) {

super.updateItem(item, empty);
if (empty || item == null)
setGraphic(null);
else {
setGraphic(checkBox);
checkBox.setSelected(item);
}
}
};

checkBox.addEventFilter(MouseEvent.MOUSE_PRESSED, event ->
validate(checkBox, (Person) cell.getTableRow().getItem(), event));

checkBox.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if(event.getCode() == KeyCode.SPACE)
validate(checkBox, (Person) cell.getTableRow().getItem(), event);
});

tableCell.setAlignment(Pos.CENTER);
tableCell.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);

return tableCell;
});

和使用的validate方法:

private void validate(CheckBox checkBox, Person item, Event event){
// Validate here
event.consume();

Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmation Dialog");
alert.setHeaderText("Look, a Confirmation Dialog");
alert.setContentText("Are you ok with this?");

// Set the checkbox if the user want to continue
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK)
checkBox.setSelected(!checkBox.isSelected());
}

是做什么的:

它呈现一个简单的 CheckBox 并向此 CheckBox 添加两个 EventFilter。第一个在鼠标按下时执行,第二个在按键时执行(此处使用 KeyCode.SPACE)。它们都调用了 validate 方法。 validate 方法使用事件(确保 CheckBox 的选择状态未被修改),“验证”输入(我这边没有验证)然后显示确认对话。如果用户同意,则设置 CheckBoxselectedProperty

关于JavaFX CheckBoxTableCell 捕获 ClickEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39270033/

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