gpt4 book ai didi

Javafx 任务 - 更新方法的进度

转载 作者:行者123 更新时间:2023-12-02 11:42:00 25 4
gpt4 key购买 nike

在 JavaFX 应用程序中,我希望根据我在其他类中实现的某些工作逻辑来更新状态栏。

我不知道如何将我将工作逻辑传递给方法(而不是将其写入任务内部)的愿望与了解工作进度百分比结合起来。

这是具有任务的 Controller 的示例:

public class FXMLDocumentController implements Initializable {

@FXML private Label label;
@FXML ProgressBar progressBar;

@FXML
private void handleButtonAction(ActionEvent event) {

Service<Void> myService = new Service<Void>() {

@Override
protected Task<Void> createTask() {
return new Task<Void>() {

@Override
protected Void call() throws Exception {
try {
DatabaseFunctionality.performWorkOnDb();

//updateProgress(1, 1);
} catch (InterruptedException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}

return null;
}
};
}
};

progressBar.progressProperty().bind(myService.progressProperty());
myService.restart();
}

@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}

这是辅助类:

public class DatabaseFunctionality {

public static void performWorkOnDb () throws InterruptedException {
for (int i = 1; i <= 100; i++) {
System.out.println("i=" + i);
Thread.sleep(100);

//Update progress
}
}
}

谢谢

最佳答案

这里有几个选择。一种是按照 Uluk 的建议进行操作,并在 DatabaseFunctionality 中公开可观察的属性。类:

public class DatabaseFunctionality {

private final ReadOnlyDoubleWrapper progress = new ReadOnlyDoubleWrapper();

public double getProgress() {
return progressProperty().get();
}

public ReadOnlyDoubleProperty progressProperty() {
return progress ;
}

public void performWorkOnDb() throws Exception {
for (int i = 1; i <= 100; i++) {
System.out.println("i=" + i);
Thread.sleep(100);

progress.set(1.0*i / 100);
}
}
}

现在在你的 Task 中,您可以观察该属性并更新任务的进度:

Service<Void> myService = new Service<Void>() {

@Override
protected Task<Void> createTask() {
return new Task<Void>() {

@Override
protected Void call() throws Exception {
try {
DatabaseFunctionality dbFunc = new DatabaseFunctionality();
dbFunc.progressProperty().addListener((obs, oldProgress, newProgress) ->
updateProgress(newProgress.doubleValue(), 1));

dbaseFunc.performWorkOnDb();

} catch (InterruptedException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}

return null;
}
};
}
};

另一个选项(如果您不希望数据访问对象依赖于 JavaFX 属性 API)是向数据访问对象传递回调以更新进度。一个 BiConsumer<Integer, Integer> 会为此工作:

public class DatabaseFunctionality {

private BiConsumer<Integer, Integer> progressUpdate ;

public void setProgressUpdate(BiConsumer<Integer, Integer> progressUpdate) {
this.progressUpdate = progressUpdate ;
}

public void performWorkOnDb() throws Exception {
for (int i = 1; i <= 100; i++) {
System.out.println("i=" + i);
Thread.sleep(100);

if (progressUpdate != null) {
progressUpdate.accept(i, 100);
}
}
}
}

然后

Service<Void> myService = new Service<Void>() {

@Override
protected Task<Void> createTask() {
return new Task<Void>() {

@Override
protected Void call() throws Exception {
try {
DatabaseFunctionality dbFunc = new DatabaseFunctionality();
dbFunc.setProgressUpdate((workDone, totalWork) ->
updateProgress(workDone, totalWork));

dbaseFunc.performWorkOnDb();

} catch (InterruptedException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}

return null;
}
};
}
};

关于Javafx 任务 - 更新方法的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34357005/

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