3

データを表示するための小さな 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 ブロックにジャンプし、observablelist の特定の値を 0 に設定します (デバッガーでこれを見ることができます。このオブジェクトを展開します) が、tableviewcell には 0 ではなく q が表示されます (システムによって修正されています)...

テーブルビューにobservablelist-Objectの正しい値が表示されないのはなぜですか???

4

4 に答える 4

4

これは必須でしたが、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);
}

これは非常に新しいため、公式のオラクル ドキュメントにもありません...そのため、リンクを提供できません。

乾杯。

于 2016-06-20T15:46:06.190 に答える