我试图显示每个任务的进度和状态。每个任务由一行表示TableView
。每个任务在每个Thread
. 请参考图片TableView
。
对于“Progress” TableColumn
,我已将 Cell Factory 设置为渲染“ProgressBar”。
public static class ProgressBarTableCell<S, T> extends TableCell<S, T> {
private final ProgressBar progressBar;
private ObservableValue<T> ov;
public ProgressBarTableCell() {
this.progressBar = new ProgressBar();
progressBar.setPrefHeight(23);
setAlignment(Pos.CENTER);
}
@Override
public void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (item == null) {
setGraphic(null);
setText(null);
} else {
if (item.toString().equalsIgnoreCase("Processing")) {
Platform.runLater(new Runnable() {
@Override
public void run() {
if (getGraphic() == null) {
setGraphic(progressBar);
progressBar.setProgress(-1);
} else {
ProgressBar objpProgressBar = (ProgressBar) getGraphic();
objpProgressBar.setProgress(-1);
}
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
});
} else {
Platform.runLater(new Runnable() {
@Override
public void run() {
if (getGraphic() == null) {
setGraphic(progressBar);
progressBar.setProgress(0);
} else {
ProgressBar objpProgressBar = (ProgressBar) getGraphic();
objpProgressBar.setProgress(0);
}
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
});
}
}
}
}
没有显示任务的TableView
更新状态和进度,所以我在后台定期运行一个线程,当我调用 startUpdatingTableProgress() 时它会修改并TableView
在我调用stopUpdatingTableProgress ()时停止。
public void stopUpdatingTableProgress() {
keepUpdating = false;
}
public void startUpdatingTableProgress() {
keepUpdating = true;
TableProgressBarUpdator tpu = new TableProgressBarUpdator(table);
tpu.start();
}
class TableProgressBarUpdator implements Runnable {
TableView table;
public TableProgressBarUpdator(TableView fxtable) {
table = fxtable;
}
public void start() {
new Thread(this).start();
}
public void run() {
while (keepUpdating) {
try {
updateProgressbar();
Thread.sleep(1000);
} catch (Exception e) {
LogHandler.doErrorLogging("Error while updating tables cell", e);
}
}
LogHandler.doDebugLogging("Table process repainting is completed.");
}
private void updateProgressbar() throws Exception {
Platform.runLater(new Runnable() {
@Override
public void run() {
((TableColumn) table.getColumns().get(0)).setVisible(false);
((TableColumn) table.getColumns().get(0)).setVisible(true);
}
});
}
}
但是现在我JavaFX
的应用程序的用户界面在连续几次后冻结。有没有其他方法可以在后台线程中调用updateProgressbar()在特定时间间隔后自动触发并且不会冻结我JavaFX
的应用程序的 UI?
我不知道我是否以正确的方式更新每个任务在单独线程中运行的任务状态。如果我想在的帮助下实现这一点,javafx.concurrent package
任何人都可以向我展示一些指导或流程吗?什么将进入任务,什么将进入服务类?我如何安排它更新进度条?仅供参考:一次只允许 5 个线程并行执行。
已编辑 -
根据安迪先生的建议,直到我更新了我的代码但仍然没有运气 -
TableColumn tableColumn_Progress = new TableColumn("Progress");
tableColumn_Progress.setCellValueFactory(new PropertyValueFactory<QueueData, Double>("progressBar"));
tableColumn_Progress.setPrefWidth(100);
Callback<TableColumn<QueueData, Double>, TableCell<QueueData, Double>> attachmentCellFactory = //
new Callback<TableColumn<QueueData, Double>, TableCell<QueueData, Double>>() {
@Override
public TableCell call(final TableColumn param) {
final ProgressBarTableCell cell = new ProgressBarTableCell() {
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
}
};
return cell;
}
};
tableColumn_Progress.setCellFactory(attachmentCellFactory);
在 QueueData 类中 -
DoubleProperty progressBar = null;
public DoubleProperty progressBarProperty() {
return progressBar;
}
public Double getprogressBar() {
return progressBar.get();
}
public void setprogressBar(Double sType) {
this.progressBar = new SimpleDoubleProperty(sType);
}
并且没有调用任何后台线程来更新 UI,但没有运气。