【发布时间】:2014-01-02 08:47:17
【问题描述】:
我有一个表格,它有一列带有复选框。
单击按钮时,我想找出哪些复选框被选中,哪些未被选中。 到目前为止,我设法在表格中创建了复选框。 代码如下。
public class TTEs implements Initializable {
@FXML
private TableView<TestObject> tableReport;
@FXML
private TableColumn<TestObject, String> name;
@FXML
private TableColumn<TestObject, Boolean> checkbox;
@FXML
public void getValues() {
//the method will get what check boxes are checked (this part is the problem)
}
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
ObservableList<TestObject> data = FXCollections.observableArrayList();
data.add(new TestObject("Test 1", true));
data.add(new TestObject("Test 2", false));
tableReport.setItems(data);
name.setCellValueFactory(new PropertyValueFactory<TestObject, String>("name"));
checkbox.setCellValueFactory(new PropertyValueFactory<TestObject, Boolean>("checked"));
checkbox.setCellFactory(new Callback<TableColumn<TestObject, Boolean>,
TableCell<TestObject, Boolean>>() {
public TableCell<TestObject, Boolean> call(TableColumn<TestObject, Boolean> p) {
return new CheckBoxTableCell<TestObject, Boolean>();
}
});
}
//CheckBoxTableCell for creating a CheckBox in a table cell
public static class CheckBoxTableCell<S, T> extends TableCell<S, T> {
private final CheckBox checkBox;
private ObservableValue<T> ov;
public CheckBoxTableCell() {
this.checkBox = new CheckBox();
this.checkBox.setAlignment(Pos.CENTER);
setAlignment(Pos.CENTER);
setGraphic(checkBox);
}
@Override public void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
setGraphic(checkBox);
if (ov instanceof BooleanProperty) {
checkBox.selectedProperty().unbindBidirectional((BooleanProperty) ov);
}
ov = getTableColumn().getCellObservableValue(getIndex());
if (ov instanceof BooleanProperty) {
checkBox.selectedProperty().bindBidirectional((BooleanProperty) ov);
}
}
}
}
}
当我调试时,我发现:
ov = getTableColumn().getCellObservableValue(getIndex());
if (ov instanceof BooleanProperty) {
checkBox.selectedProperty().bindBidirectional((BooleanProperty) ov);
}
在上述情况下,它永远不会进入if 语句中,这意味着ov 不是BooleanProperty 的实例。但是当我打印ov的类时,
System.out.println(ov.getClass().getName());
它打印为
javafx.beans.property.ReadOnlyObjectWrapper
ReadOnlyObjectWrapper 是BooleanProperty 的子类,那么为什么instanceof 检查不起作用?
【问题讨论】:
-
Noo,那是在 java swing 中。我的应用程序正在使用 javaFX。那里有很多不同。
-
gotozero 下面的答案对我有用,并花了大约一分钟来实施。如果您使用 fxml,则无需更改代码。
-
如果你想检查子类你可以使用
if (BooleanProperty.class.isAssignableFrom(myObject.getClass()))