2014-11-23 69 views
1

我想在onAction区块中有一个更新进度条。出于某种原因,在下面的代码中,进度条不会更新,直到它退出onAction块。我没有进步九秒,然后90%。 System.out打印就好。JavaFx中的ProgressBar不会在onAction区块中更新

package net.snortum.play; 

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ProgressBar; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class ProgressBarTester extends Application { 

    public static void main(String[] args) { 
     launch(ProgressBarTester.class, args); 
    } 

    @Override 
    public void start(final Stage stage) throws Exception { 
     final GridPane grid = new GridPane(); 
     grid.setAlignment(Pos.CENTER); 
     grid.setHgap(10); 
     grid.setVgap(10); 
     grid.setPadding(new Insets(25, 25, 25, 25)); 

     final Text title = new Text("Test Progress Bar"); 
     int col = 0, row = 0, colSpan = 2, rowSpan = 1; 
     grid.add(title, col, row, colSpan, rowSpan); 

     col = 0; 
     row++; 
     grid.add(new Label("Progress:"), col, row); 
     col = 1; 
     final ProgressBar progress = new ProgressBar(0.0); 
     grid.add(progress, col, row); 

     final HBox hbox = new HBox(); 
     hbox.setAlignment(Pos.BASELINE_RIGHT); 
     final Button submit = new Button("Go"); 
     hbox.getChildren().add(submit); 
     col = 1; 
     row++; 
     grid.add(hbox, col, row); 

     submit.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       double size = 10.0; 
       for (double i = 0.0; i < size; i++){ 
        progress.setProgress(i/size); 
        System.out.printf("Complete: %02.2f%n", i * 10); 

        try { 
         Thread.sleep(1000); 
        } catch(InterruptedException ex) { 
         Thread.currentThread().interrupt(); 
        } 
       } 
      } 

     }); 

     final Scene scene = new Scene(grid); 
     stage.setScene(scene); 
     stage.setTitle("Test Progress Bar"); 
     stage.show(); 
    } 

} 

回答

10

tomsomtom的确切的答案的长格式JavaFX的事件线程:

如果你使用JavaFX Thread来做这种长期的工作,你停止UI的更新等等。所以你必须在sparate thread中运行你的worker。如果你在一个单独的线程中运行,所有的GUI操作像progress.setProgress()必须使用runLater()返回到JavaFX线程,因为JavaFX不是多线程的。

在您的行动试试这个:

submit.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      double size = 10.0; 
      new Thread(){ 
       public void run() { 
        for (double i = 0.0; i < size; i++){ 
         final double step = i; 
         Platform.runLater(() -> progress.setProgress(step/size)); 
         System.out.printf("Complete: %02.2f%n", i * 10); 

         try { 
          Thread.sleep(1000); 
         } catch(InterruptedException ex) { 
          Thread.currentThread().interrupt(); 
         } 
        } 
       } 
      }.start(); 
     } 

    }); 
1

你是阻止你需要做的另一个线程的工作,并同步放用Platform.runLater的setProgress呼叫