加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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();
        }

    } );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读