当前位置: 首页 > 知识库问答 >
问题:

Javafx TableView编辑验证

璩慎之
2023-03-14

我构建了一个用于显示数据的小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”(这个值是不允许的)并按Enter时,调试器在上面的catch块中跳转,将观察列表中的特定值设置为0(我可以在调试器中看到这一点,当我展开这个对象时)但是tableviewcell仍然显示q而不是0(系统已经纠正了)...

为什么tableview没有显示观察列表对象的正确值???

共有3个答案

公冶宏深
2023-03-14

虽然刷新(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。补丁附件您将发现各种皮肤的变化,特别是针对TableViews、TableViewSkinBase的变化。此模块未在src javafx中提供。jdk安装附带的zip。正在查找有关如何将SkinBase更改整合到u51安装的信息。

郁高韵
2023-03-14

好吧,这似乎是一个错误。我使用了一个工作,这里提到了:

tblShots.getColumns().get(1).setVisible(false);
tblShots.getColumns().get(1).setVisible(true);
卓宏达
2023-03-14

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

/**
 * 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);
}

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

干杯

 类似资料:
  • 在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图。但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好。打开Models \ Movie.cs文件,并添加高亮行如下所示: using System; using System.ComponentModel.DataAnnotations; using System.Data.E

  • 我创建了一个TableView,其中包含一个复选框列(isSelected)和三个信息列(姓名、姓氏、职务)。我想根据用户信息禁用一些复选框。例如,如果用户名为“Peter”,则Peter旁边的复选框将被禁用。但我不能。以下是我的一些代码: 人JAVA 控制器。JAVA

  • 我使用进行单元格编辑,并在Editable=true的上使用验证器。如果选择的P:SelectoneMenu值或键入的值无效,我希望单元格编辑状态保持在编辑模式(第二个屏幕截图),并像使用常规表单(第三个屏幕截图)一样在输入周围显示红色框。当验证失败时,会显示咆哮和消息,但下拉框周围的红色框不会持续存在,我担心用户可能不会注意到(第一张屏幕截图)。我不知道如何进行ajax更新来显示红色框,但保持单

  • 我已经为我的组织的需求添加了一些自定义属性到注册字段。根据文档自定义了主题并添加了验证。很好用。我可以添加这些属性到帐户管理页面也通过修改帐户模板。

  • 不久前,我开始在我的项目中使用google play服务。错误是随机出现的。当我进入Windows/Google Play Games/Setup/Android Setup时。。。然后单击“设置”,错误消失,但经过几次编译后,它再次出现。我不知道是什么导致了这个问题。 我认为这与谷歌游戏有关,但之前没有发生过,所以我不确定是否是这样。 NullReferenceException:对象引用未设置

  • 在JavaFX 8中,我尝试在将新行添加到表中后编辑单元格,以优化用户体验。 选择了正确的行,但单元不会进入编辑模式。嗯,我很偶然地看到了这种情况,但很难再现。我做错了什么?