- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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
的选择状态未被修改),“验证”输入(我这边没有验证)然后显示确认对话。如果用户同意,则设置 CheckBox
的 selectedProperty
。
关于JavaFX CheckBoxTableCell 捕获 ClickEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39270033/
我想了解更多关于如何实际使用或子类(如有必要)CheckBoxTableCell。在一个特定的情况下,我想使用这个类,其中复选框不绑定(bind)到底层数据模型属性。 假设我有一个名为“Select”
我有一个关于 JavaFX 库的特殊问题,这可能会揭示我对 JavaFX 框架的总体理解中的缺陷。 让我们假设有一个名为 Entity 的实体类有一个 BooleanProperty叫checked
我正在尝试向我的 CheckBoxTableCells 添加一个更改监听器,但它似乎不起作用。我以 CheckBoxes 为例,认为它们的工作方式相同。但是,当我更改其值时没有输出。我如何将一个正确地
我正在基于此示例在 JavaFX 中创建一个包含可扩展行的表: http://codemonkeycorner.com/post/expandable-table-rows-in-javafx 我还以
在 TableView 中使用 CheckBoxTableCell 我不想在用户单击复选框时执行某些代码。此代码需要在检查 CheckBox 之前以及更改关联的属性之前执行。 由于 CheckBoxT
当通过单击列标题对 TableView 进行排序时,复选框行为变得异常。如果您选中其中一个,另一个似乎已绑定(bind)到它,并且也被选中。 在对 TableView 进行排序之前,一切都按预期进行,
我找不到任何在 TableViewerColumn 中使用 CheckBoxTableCell 的示例,如果有人可以为我提供示例实现,我将不胜感激。 我已经有一个显示一些字符串值的工作模型,但我无法将
我想在用户选中或取消选中 tableView 中的复选框时触发方法或操作。当用户使用 checkBox 时, coursData.addListener(...) 不会被触发。 这是我编译的代码,窗口
我扩展了 SimpleObjectProperty创建自定义延迟加载实现(see here),LazyLoadingObjectProperty . 要将此通用实现用于 boolean 属性,我使用
isText.setEditable(true); isText.setCellValueFactory(new Callback, ObservableValue>() {
我需要一些帮助,即使我的情况很简单。但我不明白为什么 TableView 中的复选框没有获取值。我从 javafx ensemble 中得到了示例 我有课 public class Reservati
在我的 TableView 中,我想要一个包含复选框的列。通过此复选框,用户可以选择要为特定操作(例如删除)标记哪些行。我尝试过使用 CheckBoxTableCell,但我看到的所有示例都已将复选框
我想将 TableViewCell 中的 CheckBox 绑定(bind)到 BooleanBinding。以下示例由具有列 name 和 isEffectiveRequired 的 TableVi
我想知道如何在没有 ObservableProperty 的情况下使用 CheckBoxTableCell。我使用一个简单的 boolean 值,因为我想将数据序列化到我的 DerbyDB。 当然,有
我是一名优秀的程序员,十分优秀!