javafx-8 - 如何避免更改 TableView 中的单个 CheckBox 条目。所有其他复选框条目应该是可更改的
问题描述
如何避免更改 TableView 中的单个 CheckBox 条目。所有其他 CheckBox 条目应该是可更改的。不应该取消选择特定条目。
适用于 Java 开发人员的 Eclipse IDE 版本:Photon Release (4.8.0) 内部版本号:20180619-1200 操作系统:Windows 10、v.10.0、x86_64 / win32 Java 版本:1.8.0_1
package checkbox;
import javafx.application.Application;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.util.Callback;
public class TableCellFactorySample extends Application {
public static final String DONT_MISS = "Love";
private void init(Stage primaryStage) {
Group root = new Group();
primaryStage.setScene(new Scene(root));
final ObservableList<Needs> data = FXCollections.observableArrayList(new Needs(true, "Gold"),
new Needs(false, "SUV"), new Needs(true, DONT_MISS), new Needs(true, "Diamonds"),
new Needs(false, "Boot"));
TableColumn<Needs, Boolean> neededColumn = new TableColumn<>("Need Things");
neededColumn.setMinWidth(50);
neededColumn.setCellValueFactory(
new Callback<TableColumn.CellDataFeatures<Needs, Boolean>, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(CellDataFeatures<Needs, Boolean> param) {
Needs need = param.getValue();
SimpleBooleanProperty needBooleanProperty = new SimpleBooleanProperty(need.isNeeded());
needBooleanProperty.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue,
Boolean newValue) {
if (need.getName().equals(DONT_MISS)) {
System.err.println("Avoid changing the Checkbox");
} else {
System.err.println("Changing");
}
System.err.println(need.getName() + " / " + needBooleanProperty + "\n");
}
});
return needBooleanProperty;
}
});
neededColumn.setCellFactory(//
new Callback<TableColumn<Needs, Boolean>, TableCell<Needs, Boolean>>() {
@Override
public TableCell<Needs, Boolean> call(TableColumn<Needs, Boolean> abbreviation) {
CheckBoxTableCell<Needs, Boolean> checkBoxTableCell = new CheckBoxTableCell<Needs, Boolean>();
checkBoxTableCell.setAlignment(Pos.CENTER);
return checkBoxTableCell;
}
});
TableColumn<Needs, String> nameColumn = new TableColumn<>("Name");
nameColumn.setCellValueFactory(new PropertyValueFactory<Needs, String>("name"));
TableView<Needs> tableView = new TableView<>();
tableView.setItems(data);
tableView.setEditable(true);
tableView.getColumns().add(neededColumn);
tableView.getColumns().add(nameColumn);
root.getChildren().add(tableView);
}
@Override
public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
package checkbox;
public class Needs {
private boolean needed;
private String name;
Needs(boolean needed, String name) {
this.needed = needed;
this.name = name;
}
public boolean isNeeded() {
return needed;
}
public void setNeeded(boolean needed) {
this.needed = needed;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return this.name;
}
}
解决方案
您可以通过多种解决方案获得所需的结果。其中两个如下:
解决方案#1:如果您不想更改,请重置该值
neededColumn.setCellValueFactory(
new Callback<TableColumn.CellDataFeatures<Needs, Boolean>, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(CellDataFeatures<Needs, Boolean> param) {
Needs need = param.getValue();
SimpleBooleanProperty needBooleanProperty = new SimpleBooleanProperty(need.isNeeded());
ChangeListener<Boolean> listener = new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (need.getName().equals(DONT_MISS)) {
System.err.println("Avoid changing the Checkbox");
// RESET THE VALUE WHEN YOU DONT WANT TO CHANGE
Platform.runLater(() -> {
needBooleanProperty.removeListener(this);
needBooleanProperty.set(oldValue);
needBooleanProperty.addListener(this);
});
} else {
System.err.println("Changing");
}
System.err.println(need.getName() + " / " + needBooleanProperty + "\n");
}
};
needBooleanProperty.addListener(listener);
return needBooleanProperty;
}
});
解决方案#2:如果您不想更改,则不允许与复选框交互
neededColumn.setCellFactory(//
new Callback<TableColumn<Needs, Boolean>, TableCell<Needs, Boolean>>() {
@Override
public TableCell<Needs, Boolean> call(TableColumn<Needs, Boolean> abbreviation) {
CheckBoxTableCell<Needs, Boolean> checkBoxTableCell = new CheckBoxTableCell<Needs, Boolean>() {
@Override
public void updateItem(Boolean item, boolean empty) {
super.updateItem(item, empty);
setDisable(false);
if (getTableRow() != null && !empty) {
Needs needs = getTableView().getItems().get(getIndex());
if (needs.getName().equals(DONT_MISS)) {
setDisable(true);
}
}
}
};
checkBoxTableCell.setAlignment(Pos.CENTER);
return checkBoxTableCell;
}
});
推荐阅读
- node.js - 为什么 ESlint 显示 Unable to resolve path to module 错误?
- python - 关系“app_model”不存在第 1 行:SELECT COUNT(*) AS “__count” FROM “app_model”
- setuptools - 如何在 setup.py 和应用程序代码之间共享包元数据?
- python - 如何将列表过滤为三个子列表?
- android - Android 日历 - 查询 Instances 表并不总是返回新数据
- javascript - URL() 构造函数在 chrome 的主机中添加 %20,但在 Firefox 中无效
- google-cloud-platform - Terraform 按名称和时间戳检索最新的 GCE 图像
- jenkins - 来自单个 json 文件的主动选择反应参数
- c++ - 如何在 QDateTimeEdit 中更改字体颜色
- r - 在 R ggplot 轴中使用表达式和非 ASCII 字符