【发布时间】:2014-05-23 04:00:40
【问题描述】:
我一直在寻找有关如何创建多个任务并让它们一个接一个运行的问题。这是java代码:
public class Main extends Application {
DropShadow shadow = new DropShadow();
Button button = new Button("Start");
Task<Integer> task;
Task<Integer> task2;
Label label1 = new Label("Status: NOT STARTED");
ProgressBar bar = new ProgressBar(0);
ProgressIndicator pi = new ProgressIndicator(0);
Thread th = new Thread();
public void start(Stage stage) {
task = new Task<Integer>() {
protected Integer call() throws Exception {
int iterations;
for (iterations = 0; iterations < 1001; iterations++) {
if (isCancelled()) {
updateMessage("Cancelled");
break;
}
updateProgress(iterations, 1001);
updateMessage("Test");
try {
Thread.sleep(10);
} catch (InterruptedException interrupted) {
if (isCancelled()) {
//updateMessage("Cancelled");
break;
}
}
}
return iterations;
}
};
task2 = new Task<Integer>() {
protected Integer call() throws Exception {
int iterations;
for (iterations = 0; iterations < 1001; iterations++) {
if (isCancelled()) {
updateMessage("Cancelled");
break;
}
updateProgress(iterations, 1001);
updateMessage("Test");
try {
Thread.sleep(10);
} catch (InterruptedException interrupted) {
if (isCancelled()) {
//updateMessage("Cancelled");
break;
}
}
}
return iterations;
}
};
task.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
public void handle(WorkerStateEvent arg0) {
label1.setText("Done");
new Thread(task2).start();
}
});
Group root = new Group();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("Progress Controls");
final Slider slider = new Slider();
slider.setMin(0);
slider.setMax(50);
bar.progressProperty().bind(task.progressProperty());
pi.progressProperty().bind(task.progressProperty());
label1.textProperty().bind(task.messageProperty());
button.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
public void handle(MouseEvent e) {
button.setEffect(shadow);
new Thread(task).start();
}
});
button.addEventHandler(MouseEvent.MOUSE_RELEASED, new EventHandler <MouseEvent>() {
public void handle(MouseEvent arg0) {
button.setEffect(null);
}
});
final HBox hb = new HBox();
hb.setSpacing(5);
hb.setAlignment(Pos.CENTER);
hb.getChildren().addAll(bar, pi, button, label1);
scene.setRoot(hb);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
基本上我想要两个进度条和大约 5 个任务。一个进度条用于当前正在运行的任务,另一个用于总体进度。一旦 task1 完成,我希望它运行 task 2 并将进度条更新回零,同时增加另一个进度条。但是,一旦我为其他任务创建了一个新线程,GUI 中的任何内容都不会更新。
提前致谢。
编辑: 我已经修复了启动第二个任务的代码部分。但是,我有这些问题:
如何创建一个随着不同任务的完成而更新的整体进度条?
如何在每个新任务启动后动态重置和更新每个单独任务的单个进度条?我是否必须为此创建各种 ProgressBar 对象?
【问题讨论】:
-
您的 EventHandler 为 task2 创建了一个新线程,但它从不启动线程或在任何地方存储对它的引用。
-
刚刚解决了这个问题。但是如何重置进度条以显示任务 2 的状态?
-
@jameslarge - 我猜我必须修改 bar.progressProperty().bind(task.progressProperty());但是一旦“任务”完成并且现在“任务2”正在运行,我该如何动态更改?
-
@jewelsea - 可能,但我刚刚找到了解决方案
标签: java multithreading javafx task