具有JavaFXProgressBar行为的Pb
当我第一次启动与进度条绑定的任务时,进度条开始倒带,然后重新启动,这一次是根据我的计数器(正如我预期的那样)。这种不必要的影响是非常微妙的,但却是显而易见的 下面是我的测试代码:具有JavaFXProgressBar行为的Pb,java,javafx,Java,Javafx,当我第一次启动与进度条绑定的任务时,进度条开始倒带,然后重新启动,这一次是根据我的计数器(正如我预期的那样)。这种不必要的影响是非常微妙的,但却是显而易见的 下面是我的测试代码: private void startButtonEventHandler(ActionEvent event) { Service<Void> service = new Service<Void>() { @Override protected Task<Void> cr
private void startButtonEventHandler(ActionEvent event) {
Service<Void> service = new Service<Void>() {
@Override
protected Task<Void> createTask() {
Task<Void> task = new Task<Void>() {
@Override
public Void call() throws Exception {
for (int i = 1; i <= 10; i++) {
// Long running task ...
Thread.sleep(500);
updateProgress(i, 10);
}
return null;
}
};
progressBar.progressProperty().bind(task.progressProperty());
return task;
}
};
service.start();
}
更新:我意识到progressBar在开始时以待定模式启动,然后在第一次调用updateProgress()方法后,它切换到确定模式。这是错误还是功能?任务的初始进度是
-1
(即不确定)。(这很有意义,因为默认情况下任务不知道需要多长时间…)因此,当您将进度条的进度绑定到任务的进度时,进度条将变得不确定
创建任务时,只需将其进度设置为0:
protected Task<Void> createTask() {
Task<Void> task = new Task<Void>() {
{
updateProgress(0, 10);
}
@Override
public Void call() throws Exception {
for (int i = 1; i <= 10; i++) {
// Long running task ...
Thread.sleep(500);
updateProgress(i, 10);
}
return null;
}
};
progressBar.progressProperty().bind(task.progressProperty());
return task;
}
受保护的任务createTask(){
任务=新任务(){
{
updateProgress(0,10);
}
@凌驾
public Void call()引发异常{
对于(int i=1;在启动服务之前,您是否尝试将进度条的进度属性绑定到服务的进度属性,而不是progressBar.progressProperty().bind(task.progressProperty())
?是的,但它并没有解决这个奇怪的行为。哦,还没有…仍然是那个恼人的效果。有时还可以,有时会出现不确定的状态(我说每两次尝试一次)。我尝试了你的更新,但没有改变任何东西。同时,我在我的家用计算机上尝试了这个代码(下面是同一个JDK 8.121 64)这一次,无论我运行多少次,都没有可见的不确定状态可见。我的家用计算机内部有一个Core i7 i7-7700K Kaby Lake处理器,我的工作计算机运行在旧的Core i5代上,我相信这可以解释整个差异。然而,我倾向于相信这是一个JavaFX错误,可能会继续存在不被当今快速处理器所注意。
protected Task<Void> createTask() {
Task<Void> task = new Task<Void>() {
{
updateProgress(0, 10);
}
@Override
public Void call() throws Exception {
for (int i = 1; i <= 10; i++) {
// Long running task ...
Thread.sleep(500);
updateProgress(i, 10);
}
return null;
}
};
progressBar.progressProperty().bind(task.progressProperty());
return task;
}