

環境は Java SE (Java 8 Update 40) on Windows 7

[code]

      tracker = new TrackBackupService();  
      tracker.setOnReady((WorkerStateEvent e) -> {  
        backupUserCancelled = false;  
      });  
    
      tracker.setOnScheduled((WorkerStateEvent e) -> {  
        backupProgressBar.progressProperty().bind(tracker.progressProperty());  
        backupPathInProcessingLabel.textProperty().bind(tracker.pathInProcessingProperty());  
        backupWorkDoneLabel.textProperty().bind(tracker.workDoneProperty().asString("%.0f"));  
        backupTotalWorkLabel.textProperty().bind(tracker.totalWorkProperty().asString("%.0f"));  
        backupSelectTargetButton.disableProperty().bind(tracker.runningProperty());  
        backupWarningMessageLabel.visibleProperty().bind(tracker.runningProperty());  
        backupStartButton.disableProperty().bind(tracker.runningProperty());  
        backupStopButton.disableProperty().bind(Bindings.not(backupStartButton.disableProperty()));  
        backupSizeLabel.textProperty().bind(tracker.totalSizeProperty());  
        backupDirectoryCountLabel.textProperty().bind(tracker.directoryCountProperty().asString());  
        backupFileCountLabel.textProperty().bind(tracker.fileCountProperty().asString());  
        backupResultLabel.textProperty().bind(tracker.messageProperty());  
      });  
    
[/code]

こちらはサービスクラス（extends Service）のコードです。

[code]

    updateProgress(_doneCount, _totalCount);
    updateMessage("成功：" + _succeededCount + " / " + "失敗：" + _failedCount);
    
    Platform.runLater(() -> {
      succeededCount.set(_succeededCount);
      succeededFileCount.set(_succeededFileCount);
      succeededDirectoryCount.set(_succeededDirectoryCount);
      failedCount.set(_failedCount);
      failedFileCount.set(_failedFileCount);
      failedDirectoryCount.set(_failedDirectoryCount);
      totalSize.set(_totalSize);
      directoryCount.set(_directoryCount);
      fileCount.set(_fileCount);
      pathInProcessing.set(_pathInProcessing);
    });
    
[/code]

このようなコードでプログレスバーを更新しようとしても、描画がされないときがあります。  
しかし、ウインドウを最小化して最大化すると、描画が行われます。  
プログレスバーを強制再描画するようなメソッドはありますでしょうか？

現象発生時のアニメーションです。

![enter image description here](https://i.stack.imgur.com/nO5Pj.gif)

また、UIのスタイルについてはCSSで変更しています。


CC BY-SA 3.0
2015-08-03T05:15:54.037
12973
2015-08-07T09:28:18.233
2015-08-03T08:12:14.950
46
10772
question
java javafx
JavaFXのProgressBarが更新されません


コードには問題が無いように見受けられます。問題が起きる時と起きない時があるようなので、JavaFX
自体の問題の可能性が高いですね。あるいは実行環境の問題かもしれません。  
マシンや JDK のバージョンを変えても問題が再現するか、確認した方が良いと思います。

OpenJDK のバグトラッカを見る限り、該当しそうな問題は JDK8 の最初のリリースバージョンで修正済みとなっています。  
<https://bugs.openjdk.java.net/browse/JDK-8124671>

似たような以下の問題もありましたが、これは動的に Skin
を変えた時の問題なので、今回のケースとは少し異なりそうです。スタイルの問題なので、ProgressBar
に設定しているスタイルを外してみたら状況が変わるかもしれません。  
<https://bugs.openjdk.java.net/browse/JDK-8087746>

> プログレスバーを強制再描画するようなメソッドはありますでしょうか？

強制再描画させるような public のメソッドはありません。protected なメソッドには
[setNeedsLayout()](http://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/Parent.html#setNeedsLayout-
boolean-) という子 Node のレイアウトの再評価を強制するメソッドはあります。


CC BY-SA 3.0
2015-08-07T09:28:18.233
13139
2015-08-07T09:28:18.233
3374
12973
answer