【问题标题】:Javafx TableView Edit ValidationJavafx TableView 编辑验证
【发布时间】:2014-10-19 23:18:15
【问题描述】:

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

这是我的班级:

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块中,将observablelist中的具体值设置为0(我可以在调试器,当我展开这个对象时),但 tableviewcell 仍然显示 q 而不是 0(已被系统更正)...

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

【问题讨论】:

    标签: javafx tableview edit observablelist


    【解决方案1】:

    这是必需的,但自 Java8u60 以来是全新的(是的 - 他们在 udpate 中更改了 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 文档中都没有……所以我无法提供链接。

    干杯。

    【讨论】:

      【解决方案2】:

      好吧,这似乎是一个错误。我使用了一种解决方法,提到了here

      tblShots.getColumns().get(1).setVisible(false);
      tblShots.getColumns().get(1).setVisible(true);
      

      【讨论】:

      • tableView.refresh();
      【解决方案3】:

      虽然refresh() 绝对可以与升级到8u60 一起使用,但我工作的大型项目目前停留在8u51 上,并且无法合理地很快转移到u60。我尝试在 Rainer 引用的 refresh() 中实现代码来代替上面提到的其他 kluges,特别是将列设置为不可见/可见。但是,只需实现

      getProperties().put(TableViewSkinBase.RECREATE, Boolean.TRUE);
      

      u51 中不起作用。在进行更多谷歌搜索后,我在这里遇到了 JavaFx/Oracle Jira 问题:

      https://bugs.openjdk.java.net/browse/JDK-8098085

      如果您打开rt22599.patch 附件,您会发现各种皮肤的变化,特别是TableViewsTableViewSkinBase。此模块未在 jdk 安装随附的 src-javafx.zip 中提供。寻找有关如何将 SkinBase 更改合并到 u51 安装的信息。

      【讨论】:

        【解决方案4】:

        从 JavaFX 8u60 开始可以使用(假设 tableView 是 TableView 类的一个实例):

        tableView.refresh();
        

        它对我有用

        【讨论】:

        • 你为什么要重复@Rainer 和 OP 的早期答案;)
        猜你喜欢
        • 1970-01-01
        • 2012-10-05
        • 2014-10-14
        • 2014-02-22
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多