6

マルチスレッド環境で ProgressBar を更新する方法を理解しようとしています。ここで何か間違ったことをしていますが、それが何であるかわかりません。これにより、3 秒ごとにバーがいっぱいになるはずですが、そうではありません。

    Task<Void> task = new Task<Void>(){
        @Override
        public Void call(){
            for (int i = 1; i < 10; i++)    {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(i);
                updateProgress(i , 10);
            }
        return null;                
        }
    };

    updProg = new ProgressBar();
    updProg.progressProperty().bind(task.progressProperty());

    Thread th = new Thread(task);
    th.setDaemon(true);
    th.start();

私は何が欠けていますか?

4

4 に答える 4

9

あなたのサンプルは私にとってはうまくいきます。

サンプルは 3 秒ごとに少しずつバーを満たし、30 分でバーを完全に満たします。

実行可能にするためにいくつかの足場コードでラップしただけで、変更なしで機能しました(java7u15、win7)。

シンプルなタスク進行

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class ProgressTest extends Application {
  public static void main(String[] args) { Application.launch(args); }
  @Override public void start(Stage stage) {
    Task<Void> task = new Task<Void>() {
      @Override public Void call() {
        for (int i = 0; i < 10; i++) {
          try {
            Thread.sleep(100);
          } catch (InterruptedException e) {
            Thread.interrupted();
            break;
          }
          System.out.println(i + 1);
          updateProgress(i + 1, 10);
        }
        return null;
      }
    };

    ProgressBar updProg = new ProgressBar();
    updProg.progressProperty().bind(task.progressProperty());

    Thread th = new Thread(task);
    th.setDaemon(true);
    th.start();

    StackPane layout = new StackPane();
    layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;");
    layout.getChildren().add(updProg);

    stage.setScene(new Scene(layout));
    stage.show();
  }
}

おそらく、ProgressBar の更新に関するバグ (現在は修正済み) がある Java 8 の早期アクセス バージョンを使用している可能性があります。

RT-29018 progressProperty が更新されると ProgressBar と ProgressIndicator が消える

于 2013-03-19T23:46:41.650 に答える
1

最新のJDK8Early-Accessを使用していますか?もしそうなら、私が提出したこのバグレポートを参照してください:http://javafx-jira.kenai.com/browse/RT-29018

基本的に、早期アクセスビルドの最近のリリースでは、スキンとcssにいくつかの変更が加えられました。これにより、親ノードよりもダーティであるが両方とも同じパルスで再ペイントする必要がある子ノードが、親のダーティレベルが子ノードのダーティレベルを上書きするという隠れたバグが明らかになりました。

これにより、進行状況が表示されなくなります。実際、タスクから呼び出されるとprogressBarすぐに、私にとっては完全に見えなくなりました。updateProgress彼らにはパッチがあります、これがいつ行われるかはわかりません。

回避策は、パッチを待っている間にjdk7を使用するか、私が行ったことを実行して、古いcssからcssスタイルシートにこれを適用することです。

/*hack to get progress bar working. From: JDK7u17 jfxrt.jar!/com/sun/javafx/scene/control/skin/caspian/caspian.css */

/*******************************************************************************
 *                                                                             *
 * ProgressBar                                                                 *
 *                                                                             *
 ******************************************************************************/

.progress-bar {
    -fx-skin: "com.sun.javafx.scene.control.skin.ProgressBarSkin";
    -fx-background-color:
        -fx-box-border,
        linear-gradient(to bottom, derive(-fx-color,30%) 5%, derive(-fx-color,-17%));
    -fx-background-insets: 0, 1;
    -fx-indeterminate-bar-length: 60;
    -fx-indeterminate-bar-escape: true;
    -fx-indeterminate-bar-flip: true;
    -fx-indeterminate-bar-animation-time: 2;
    -fx-focus-traversable: true;
}

.progress-bar .bar {
    -fx-background-color:
        -fx-box-border,
        linear-gradient(to bottom, derive(-fx-accent,95%), derive(-fx-accent,10%)),
        linear-gradient(to bottom, derive(-fx-accent,38%), -fx-accent);
    -fx-background-insets: 0, 1, 2;
    -fx-padding: 0.416667em; /* 5 */
}

.progress-bar:indeterminate .bar {
    -fx-background-color: linear-gradient(to left, transparent, -fx-accent);
}

.progress-bar .track {
     -fx-background-color:
        -fx-box-border,
        linear-gradient(to bottom, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%));
    -fx-background-insets:  0, 1;
}

.progress-bar:disabled {
    -fx-opacity: 1.0
}
于 2013-03-21T08:41:26.870 に答える
0

FXML ファイルで updProg を定義した場合、ここでの初期化に問題がある可能性があります。

この行を削除してみてください:

updProg = new ProgressBar();
于 2015-11-18T15:24:49.313 に答える