Javafx TableView编辑验证

时间:2014-08-26 15:00:50

标签: javafx tableview edit observablelist

我构建了一个用于显示数据的小型JavaFX TableView。用户应该能够编辑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块,将observable列表中的特定值设置为0(我可以在调试器,当我扩展此对象时)但tableviewcell仍显示q而不是0(已由系统更正)...

为什么tableview没有显示observablelist-Object ???

的正确值

4 个答案:

答案 0 :(得分:2)

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

click()

它是如此新颖,它甚至不在官方的oracle文档中......所以我无法提供链接。

欢呼声。

答案 1 :(得分:1)

好吧,这似乎是一个错误。我使用了一个涉及here的工作:

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

答案 2 :(得分:1)

虽然refresh()肯定与升级到8u60一起使用,但我工作的大型项目目前仍停留在8u51,无法合理地移至u60任何时候。我尝试在Rainer引用的refresh()中实现代码,代替上面提到的其他克隆,特别是将列设置为不可见/可见。但是,只需实施

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安装的信息。

答案 3 :(得分:0)

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

tableView.refresh();

它对我有用