Javafx TableView 编辑验证

标签 javafx tableview edit observablelist

我构建了一个用于显示数据的小型 JavaFX TableView。用户应该能够编辑 TableView 中的数据。问题是:在某些字段中只允许使用特定值。如果用户输入了错误的值,该字段将设置为 0。

这是我的类(class):

private ObservableList shots;

@FXML
void initialize() {
    this.shots = FXCollections.observableArrayList(match.getShots()); // values from database
    tblShots.setItems(shots);
    tblShots.setEditable(true);
    lblserienid.setText(GUIConstants.idPlaceHolder);
    lblresult.setText(GUIConstants.idPlaceHolder);
    colShotID.setCellValueFactory(new PropertyValueFactory<Schuss, String>("idSchuss"));
    colRing.setCellValueFactory(new PropertyValueFactory<Schuss, String>("ringString"));
    colRing.setCellFactory(TextFieldTableCell.forTableColumn());
    colRing.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Schuss, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<Schuss, String> t) {
            Schuss s = (Schuss) t.getTableView().getItems().get(
                    t.getTablePosition().getRow());

            try {
                int ring = Integer.parseInt(t.getNewValue());
                s.setRing(ring);
            } catch (Exception ex) {
                s.setRing(0);
            }
            SerienauswertungViewController.this.refreshTable();
        }
    });
    colRing.setEditable(true);
    // .... omitted
  }

private void refreshTable(){
  if(shots.size()>0) {
        btnDeleteAll.setDisable(false);
        btnEdit.setDisable(false);
        int res = 0;
        for(int i=0;i<shots.size();i++){
            Schuss s = (Schuss)shots.get(i);
            res += s.getRing();
        }
        lblresult.setText(""+res);

    }
    else {
        btnDeleteAll.setDisable(true);
        btnEdit.setDisable(true);
        lblresult.setText(GUIConstants.idPlaceHolder);
    }
}

所以当我编辑一个 tableviewcell 并输入“q”(这个值是不允许的)并回车时,调试器跳转到上面的 catch block ,将 observablelist 中的特定值设置为 0(我可以在调试器,当我展开这个对象时)但 tableviewcell 仍然显示 q 而不是 0(已被系统更正)...

为什么 tableview 不显示 observablelist-Object 的正确值???

最佳答案

这是必需的,但自 Java8u60 以来是全新的(是的 - 他们在更新中更改了 API!?!)有一个 refresh() TableView 本身的方法。

/**
 * Calling {@code refresh()} forces the TableView control to recreate and
 * repopulate the cells necessary to populate the visual bounds of the control.
 * In other words, this forces the TableView to update what it is showing to
 * the user. This is useful in cases where the underlying data source has
 * changed in a way that is not observed by the TableView itself.
 *
 * @since JavaFX 8u60
 */
public void refresh() {
    getProperties().put(TableViewSkinBase.RECREATE, Boolean.TRUE);
}

它太新了,甚至在官方 oracle 文档中都没有...所以我无法提供链接。

干杯。

关于Javafx TableView 编辑验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25509076/

相关文章:

java - "Thread-19"java.lang.IllegalStateException : Not on FX application thread; currentThread = Thread-19

JavaFX 通过数据库值更改行颜色

ios - 无法通过 didSelectRow tableView 方法显示 View Controller

ios - TableView 滚动后播放/暂停按钮图像发生变化

linux - 使用 sed 编辑脚本中的 url 字符串

java - 分页控件和表格之间的填充

java - ScrollPane不刷新其内容

java - 尝试从方法返回两个值

javascript - 编辑 Javascript 函数

javascript - 从编辑弹出窗口保存数据