Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javafx TableView Edit Validation

I build a little JavaFX TableView for displaying data. The user should be able to edit the data in the tableview. The problem is: only specific values are allowed in certain fields. If the user entered a wrong value, the field is set to 0.

Here is my 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);
    }
}

So when I edit a tableviewcell and enter "q" (this value is not allowed) and press enter, the debugger jumps in the above catch block, sets the specific value in the observablelist to 0 (I can see this in the debugger, when I expand this object) but the tableviewcell still displays q instead of 0 (which has been corrected by the system)...

Why does the tableview not show the right values of the observablelist-Object???

like image 617
Bene Avatar asked Nov 19 '25 21:11

Bene


1 Answers

This was required but brandnew since Java8u60 (yes - they changed API in an udpate!?!) there is a refresh() method on the TableView itself.

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

It is so new, it´s not even in the official oracle docs... So I cannot provide a link.

cheers.

like image 108
Rainer Avatar answered Nov 22 '25 15:11

Rainer



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!