Javafx:使用GUI中的选择框更新单元格不起作用

时间:2015-08-13 15:34:09

标签: properties javafx tableview

我在使用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!");});

要在列排名中创建一个选项框来更改属性的te值。 ARu​​le有一个属性字段以及getter和setter:

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()返回用String或Integer

填充的这个对象
private static final ObservableList<Object> labelSample = FXCollections.observableArrayList();

问题是在界面中我可以编辑列并在labelSample列表中显示正确的值,问题是它不会更改ARule对象的值,这是由缺少的调用突出显示的setOnEditCommit处理程序。 GUI上的值是选定的新值,但保存在表中项目上的值是旧值。

我还有一个单独的按钮来更改所选行上该列的值,如果我触发该值,则值将更改为“real”(在GUI和模型上)。

代码中的错误是什么?

2 个答案:

答案 0 :(得分:1)

列的默认编辑提交行为设置为onEditCommit属性。如果你打电话

rankCol.setOnEditCommit(...);

然后将此属性设置为其他属性,即删除默认行为。

如果您想为默认行为添加其他行为,请使用addEventHandler(...)代替setOnEditCommit(...)

rankCol.addEventHandler(TableColumn.editCommitEvent(), e -> {
    System.out.println("Something happens");
});

答案 1 :(得分:0)

找到代码行的答案:

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!");});

解决了这个问题。目前我不知道为什么会这样。