Javafx:在 GUI 中使用选择框更新单元格不起作用
Javafx: updating cell using choicebox in the GUI doesn't work
我在使用 javafx 创建的 Tableview 中遇到问题。我在 tabel 的 fxml 文件上设置了 edititable="true",然后在控制器中我执行
@FXML
private TableColumn<ARule,Object> rankCol;
rankCol.setCellValueFactory(new PropertyValueFactory<ARule, Object>("label")); rankCol.setCellFactory(ChoiceBoxTableCell.forTableColumn(Main.getlabelSample()));
rankCol.setOnEditCommit(e -> {System.out.println("something happens!");});
要在列排名中创建一个选择框来更改 属性 的值。
ARule 有一个 属性 字段和 getter 和设置器:
private SimpleObjectProperty label;
public SimpleObjectProperty labelProperty() {
return label;
}
public void setLabel(Object label) {
this.label.set(label);
}
public Object getLabel(){
return this.label.getValue();
}
函数Main.getlabelSample() 重新运行这个用字符串或整数填充的对象
private static final ObservableList<Object> labelSample = FXCollections.observableArrayList();
问题是我可以在界面中编辑该列,它在 labelSample 列表中显示正确的值,问题是它不会更改 ARule 对象的值,这通过缺少突出显示调用 setOnEditCommit 处理程序。 GUI 上的值是新选择的值,但 table 中项目上保存的值是旧值。
我还有一个单独的按钮来更改所选行上该列的值,如果我触发它,"real" 的值会更改(在 GUI 和模型上)。
代码中可能有什么错误?
找到答案代码行:
rankCol.setOnEditCommit(e -> {System.out.println("something happens!");});
出于某种原因覆盖更新单元格的默认行为,将代码更改为
rankCol.setOnEditCommit(e -> {
e.getTableView().getItems().get(e.getTablePosition().getRow()).setLabel(e.getNewValue());
System.out.println("Something happens!");});
问题已解决。目前我不知道为什么会这样。
列的默认编辑提交行为设置为 onEditCommit
属性。如果你打电话给
rankCol.setOnEditCommit(...);
然后将此 属性 设置为其他内容,即删除默认行为。
如果您想为默认行为添加额外的行为,请使用 addEventHandler(...)
而不是 setOnEditCommit(...)
:
rankCol.addEventHandler(TableColumn.editCommitEvent(), e -> {
System.out.println("Something happens");
});
我在使用 javafx 创建的 Tableview 中遇到问题。我在 tabel 的 fxml 文件上设置了 edititable="true",然后在控制器中我执行
@FXML
private TableColumn<ARule,Object> rankCol;
rankCol.setCellValueFactory(new PropertyValueFactory<ARule, Object>("label")); rankCol.setCellFactory(ChoiceBoxTableCell.forTableColumn(Main.getlabelSample()));
rankCol.setOnEditCommit(e -> {System.out.println("something happens!");});
要在列排名中创建一个选择框来更改 属性 的值。 ARule 有一个 属性 字段和 getter 和设置器:
private SimpleObjectProperty label;
public SimpleObjectProperty labelProperty() {
return label;
}
public void setLabel(Object label) {
this.label.set(label);
}
public Object getLabel(){
return this.label.getValue();
}
函数Main.getlabelSample() 重新运行这个用字符串或整数填充的对象
private static final ObservableList<Object> labelSample = FXCollections.observableArrayList();
问题是我可以在界面中编辑该列,它在 labelSample 列表中显示正确的值,问题是它不会更改 ARule 对象的值,这通过缺少突出显示调用 setOnEditCommit 处理程序。 GUI 上的值是新选择的值,但 table 中项目上保存的值是旧值。
我还有一个单独的按钮来更改所选行上该列的值,如果我触发它,"real" 的值会更改(在 GUI 和模型上)。
代码中可能有什么错误?
找到答案代码行:
rankCol.setOnEditCommit(e -> {System.out.println("something happens!");});
出于某种原因覆盖更新单元格的默认行为,将代码更改为
rankCol.setOnEditCommit(e -> {
e.getTableView().getItems().get(e.getTablePosition().getRow()).setLabel(e.getNewValue());
System.out.println("Something happens!");});
问题已解决。目前我不知道为什么会这样。
列的默认编辑提交行为设置为 onEditCommit
属性。如果你打电话给
rankCol.setOnEditCommit(...);
然后将此 属性 设置为其他内容,即删除默认行为。
如果您想为默认行为添加额外的行为,请使用 addEventHandler(...)
而不是 setOnEditCommit(...)
:
rankCol.addEventHandler(TableColumn.editCommitEvent(), e -> {
System.out.println("Something happens");
});