Javafx 2 JavaFx ProgressBar绑定SimpleDoubleProperty

Javafx 2 JavaFx ProgressBar绑定SimpleDoubleProperty,javafx-2,javafx,Javafx 2,Javafx,我在tableview中使用progressbar,其中我在其属性上使用bind,以便在更改值时启动progressbar: private SimpleDoubleProperty progressBar; public Tabela(Double progressBar) { this.progressBar = new SimpleDoubleProperty(progressBar); } public Double getProgressBa

我在tableview中使用progressbar,其中我在其属性上使用bind,以便在更改值时启动progressbar:

private SimpleDoubleProperty progressBar;

    public Tabela(Double progressBar) {
    this.progressBar = new SimpleDoubleProperty(progressBar);
    }

        public Double getProgressBar() {
    return progressBar.get();
}

public DoubleProperty getProgressBarProperty() {
    return progressBar;
}

public void setProgressBar(Double progressBar) {
    this.progressBar.set(progressBar);
}

public void setProgressBar(SimpleDoubleProperty progressBar) {
    this.progressBar = progressBar;
}
在我的Hbox中,我使用progressbar,如下所示:

  final ProgressBar progress = new ProgressBar();
  progress.setMinWidth(324.0);
  progress.progressProperty().bind(tabela.getProgressBarProperty());
所以我使用了一个,这样在一段时间后,这个值就会改变,即我将控制进度条。该值已更改,但在我的tableview中什么也没有发生,但当我将列位置更改为另一个时,progressbar正在运行

“label”也发生了同样的情况,我将其改为“text”,它可以工作,但如果progressbar必须使用,我就必须使用它


有办法强制“tableview”刷新吗?

您需要遵循JavaFX命名标准,使tableview和其他小部件在可观察对象发生更改时正确刷新。例如,您应该将getProgressBarProperty()重命名为progressBarProperty()


请参阅:

此源中是否存在错误

类表

 ...

 public Tabela(String nome, Double progressBar, String etapa) {
    this.nome = nome;
    this.progressBar = new SimpleDoubleProperty(progressBar);
    this.etapa = new SimpleStringProperty(etapa);
}

....
添加新行

      private void preencheListaNomeTabelas() {
      getLista().add(new Tabela("Test", 0.0, "Test Text"));
在表中添加hbox

columTabela.setCellValueFactory(new PropertyValueFactory<Tabela, String>("nome"));
    columSituacao.setCellFactory(new Callback<TableColumn<Tabela, Double>, TableCell<Tabela, Double>>() {
        public TableCell<Tabela, Double> call(TableColumn<Tabela, Double> p) {

            final HBox box = new HBox();
            box.setPrefHeight(25.0);

            final ProgressBar progressBar = new ProgressBar(-1);

            final Text text = new Text();
            **text.textProperty().bind(..); //I would use here the**

            BorderPane border = new BorderPane();
            border.setTop(text);
            border.setBottom(progressBar);
            BorderPane.setAlignment(text, Pos.CENTER);

            box.getChildren().add(border);

            final TableCell cell = new TableCell<Tabela, Double>() {
                @Override
                protected void updateItem(Double t, boolean bln) {
                    super.updateItem(t, bln);
                    if (bln) {
                        setText(null);
                        setGraphic(null);
                    } else {
                        progressBar.setProgress(t);
                        progressBar.prefWidthProperty().bind(this.widthProperty());
                        setGraphic(box);
                        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                    }
                }
            };

            cell.setAlignment(Pos.CENTER);
            return cell;
        }
    });
    columSituacao.setCellValueFactory(new PropertyValueFactory<Tabela, Double>("progress"));
    columSituacao.setText("Progresso");

    tableView.getItems().addAll(lista);
    tableView.getSelectionModel().selectFirst();

你真的应该看看我贴的链接,因为那个人和你做的事情是一样的。使用setCellFactory在表格单元格中显示实际的ProgressBar小部件,使用setCellValueFactory(新的PropertyValueFactory(“ProgressBar”)),它将使用反射自动绑定到progressBarProperty(),以便在值更改时通知表需要重新绘制。是的,谢谢。但是现在我需要在progressbar旁边放置一个“文本”,它将与我的另一个“类”的属性进行“绑定”,但不起作用。我把代码贴出来了,这样你就能看得更清楚了。说它不起作用并不能告诉我你的问题是什么。如果您的Tabela类具有方法progressBarProperty(),则您的单元格值工厂需要设置columSituacao.setCellValueFactory(新的PropertyValueFactory(“progressBar”))。如果将该方法重命名为progressProperty(),则可以使用columSituacao.setCellValueFactory(newPropertyValueFactory(“progress”))。必须正确拼写要绑定到的属性的名称。
    Task t = new Task() {

        @Override
        protected Object call() throws Exception {
            Thread.sleep(10000);
            getLista().get(0).setEtapa("Lendo PostgreSQL");
            getLista().get(0).setProgressBar(-1.0);
            return null;
        }

    };
    new Thread(t).start();