问题描述
我使用的是 java 8 (amazon correto)。 我在 Scenebuilder 的帮助下为项目使用 JavaFX。 我的应用程序在 Main.java 中,当前功能在 Controller.java 中实现
目前,我的目标是创建一个进度条 @FXML private ProgressBar prog;
。
一旦我的 GUI 应用程序加载,我希望进度条慢慢更新,直到它从 0% 达到 50%。
然后在用户单击按钮后,我想将进度条的其余部分从 50% 更新为 100%。
我让我的控制器实现了可初始化,以便我可以将栏从 0 更新到 50%。
这是我定义用来执行此操作的 Java 任务。
import javafx.concurrent.Task;
import javafx.scene.control.ProgressBar;
public class updateBar extends Task<Void> {
final double max_bar = 1000;
private double start;
private double max;
private ProgressBar prog;
public updateBar(double start,double max,ProgressBar prog) {
this.start = start;
this.max = max;
this.prog = prog;
}
@Override
protected Void call() throws Exception {
for (double i = this.start; i <= this.max; i++) {
try{
Thread.sleep(2);
}catch (Exception e){
System.out.println(e);
}
prog.setProgress(i/max_bar);
System.out.println(prog.getProgress());
System.out.println(i+"\t"+this.max);
// updateProgress(i,max_bar);
}
return null;
}
}
我的初始化方法如下所示:
@Override
public void initialize(URL location,ResourceBundle resources) {
Thread first = new Thread((progressB(1,(double)max_bar/2)));
ExecutorService pool = Executors.newFixedThreadPool(1);
pool.execute(first);
}
问题来了,进度条的初始更新工作正常,但第二次我想更新它不起作用(这是onsubmit事件)。
这是 onsubmit 事件:
public void onSubmit() throws InterruptedException {
Thread last = new Thread((progressB(max_bar/2,max_bar)));
ExecutorService pool = Executors.newFixedThreadPool(1);
pool.execute(last);
while (!pool.isTerminated()) {
}
// method below works
Platform.runLater(this::newWin);
}
当我调用 onsubmit 时,线程没有启动,整个 GUI 应用程序冻结。
我也试过
Task task = new Task<Void>() {
@Override public Void call() {
final int max = 1000;
for (int i = 1; i <= max/2; i++) {
try{
Thread.sleep(2);
}catch (Exception e){
System.out.println(e);
}
updateProgress(i,max);
}
return null;
}
};
Task lst = new Task<Void>() {
@Override public Void call() {
final int max = 1000;
for (int i = 1; i <= max; i++) {
try{
Thread.sleep(1);
}catch (Exception e){
System.out.println(e);
}
updateProgress(i,max);
}
return null;
}
};
public void onSubmit() throws InterruptedException {
prog.progressproperty().bind(progressB(max_bar/2,max_bar).progressproperty());
prog.progressproperty().bind(lst.progressproperty());
Thread last = new Thread(lst);
last.start();
last.join();
// method below works
Platform.runLater(this::newWin);
}
@Override
public void initialize(URL location,ResourceBundle resources) {
prog.progressproperty().bind(task.progressproperty());
new Thread(task).start();
}
我错过了什么?对于我使用的所有上述技术,进度条将无法正确更新。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)