gpt4 book ai didi

JavaFX UI 卡住问题

转载 作者:搜寻专家 更新时间:2023-10-31 19:29:12 24 4
gpt4 key购买 nike

我正在尝试显示每项任务的进度和状态。每个任务由 TableView 中的一行表示。每个任务在每个 Thread 中并行执行。请引用 TableView 的图像。

enter image description here

对于“进度”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( ) 并在我调用 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 应用程序的 UI 在连续多次后卡住。有没有其他方法可以在特定时间间隔后自动触发的后台线程中调用 updateProgressbar() 并且不会卡住我的 JavaFX 应用程序的用户界面?

我不知道我更新任务状态的方法是否正确,其中每个任务都在单独的线程中运行。如果我想在 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,但运气不好。

最佳答案

你的“QueueData”类应该有方法来设置现有进度的双重属性,看起来你每次都在 setprogressBar(Double sType) 方法中设置进度状态时创建新的 SimpleDoubleProperty。

更新为 -

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

只需在开始时创建一次 progressBar 对象,然后更新现有对象。

关于JavaFX UI 卡住问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13841634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com