【发布时间】:2021-08-02 05:52:23
【问题描述】:
我有一个 TableView,其中有一列应该是布尔值的复选框(JavaFX 16、Java 11),但由于某种原因,该复选框拒绝实际绑定到对象的字段。尝试使用专门为布尔列创建的 forTableColumn 静态方法已经失败,我尝试扩展 CheckBoxTableColumn 并在其中进行绑定,但无济于事(尽管我不应该只为基本绑定这样做。
在我的 FXML 控制器中,我正在调用 ascColumn.setCellFactory(CheckBoxTableCell.forTableColumn(ascColumn));,我的列是
<TableColumn fx:id="ascColumn" text="Asc" prefWidth="$SHORT_CELL_WIDTH">
<cellValueFactory>
<PropertyValueFactory property="ascension"/>
</cellValueFactory>
</TableColumn>
它当然有效,因为复选框出现了,但是检查和取消检查实际上并没有到达源对象。没有其他列需要该字段是 ObservableValue,所有其他列都可以自己处理它,所以我正在寻找一种解决方案来处理它,源值只是一个常规布尔值。我还尝试将 selectedStateCallback 设置为返回一个 BooleanProperty,然后我添加了一个侦听器,但从未调用过该侦听器。
最终我想要实现的是复选框仅在行的对象满足某些条件时出现,为此我创建了一个扩展 CheckBoxTableCell 的新类,但是因为我无法让默认的一个工作首先,我也无法让它工作,所以我需要先解决这个问题。
编辑:因为我猜这不足以证明问题,这里有一个示例。
控制器:
public class Controller {
@FXML
private TableColumn<TestObject, Boolean> checkColumn;
@FXML
private TableView<TestObject> table;
public void initialize() {
List<TestObject> items = new ArrayList<>();
items.add(new TestObject("test1", false));
items.add(new TestObject("test2", false));
items.add(new TestObject("test3", true));
table.setItems(FXCollections.observableArrayList(items));
checkColumn.setCellFactory(CheckBoxTableCell.forTableColumn(checkColumn));
}
}
FXML:
<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.GridPane?>
<GridPane fx:controller="Controller"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
<TableView fx:id="table" editable="true">
<columns>
<TableColumn text="Name">
<cellValueFactory>
<PropertyValueFactory property="name"/>
</cellValueFactory>
</TableColumn>
<TableColumn text="Check" fx:id="checkColumn">
<cellValueFactory>
<PropertyValueFactory property="check"/>
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
</GridPane>
主类:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
@Override
public void stop() throws Exception {
super.stop();
}
public static void main(String[] args) {
launch(args);
}
}
build.gradle:
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.9'
}
group 'org.example'
version '1.0-SNAPSHOT'
mainClassName = 'Main'
repositories {
mavenCentral()
}
test {
useJUnitPlatform()
}
javafx {
version = "16"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
正如我所说,其他一切都有效,无需依赖已经是属性的输入值,forTableColumn 方法的文档字面上说该列必须是布尔值(不是可观察的),所以除非我是严重误解了某些东西,它应该可以工作
【问题讨论】:
-
我觉得我展示了正在发生的一切,因为它非常基础,但我添加了它
-
仍然无法重现 - 缺少 TestObject ;)
-
column 必须是 Boolean (not Observable) - column 类型很少是 Observable,它是 cell 值 type that must be :) 实际上,它必须是允许双向绑定的属性(单元格的文档或其实现错误,忘记了)
标签: java javafx checkbox properties boolean