user-interface – Javafx中的ProgressBar不会在onAction块中更
发布时间:2020-12-15 07:37:40 所属栏目:Java 来源:网络整理
导读:我想要一个在onAction块内更新的进度条.由于某些原因,在以下代码中,进度条在退出onAction块之前不会更新.我没有进步9秒,然后90%. System.out打印就好了. package net.snortum.play;import javafx.application.Application;import javafx.event.ActionEvent;
我想要一个在onAction块内更新的进度条.由于某些原因,在以下代码中,进度条在退出onAction块之前不会更新.我没有进步9秒,然后90%. System.out打印就好了.
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 ) ); 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:" ),row ); col = 1; final ProgressBar progress = new ProgressBar( 0.0 ); grid.add( progress,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,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(); } } 解决方法
tomsomtom的长篇精确答案:
如果您使用JavaFX Thread来执行此类长期工作,则会停止UI更新等.因此,您必须在sparate线程中运行您的worker.如果在单独的线程中运行,则必须使用runLater()将所有GUI操作(如progress.setProgress())传递回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(); } } ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |