Javafx 2 JavaFx ProgressBar绑定SimpleDoubleProperty
我在tableview中使用progressbar,其中我在其属性上使用bind,以便在更改值时启动progressbar: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
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();