Webview JavaFX 运行 进程

Webview JavaFX running with the process

在使用javafx的webview时,我想让它显示一个进度条,让用户知道它正在工作,我是说基本的程序员,所以我可以参考网上的说明,我做了以下,但没有工作,请帮帮我

        WebEngine webEngine;

        void btnSearch(ActionEvent event) {
                progressBar.indeterminateProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            String url = txtURl.getText().trim();
            if (!url.isEmpty()) {
                if (!url.startsWith("http://") || !url.startsWith("https://")) {
                    url = "http://" + url;
                }
                try {
                    webEngine = browser.getEngine();
                    webEngine.load(url);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    });
    }
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafxapplication12;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;

import static javafx.concurrent.Worker.State.RUNNING;
import static javafx.concurrent.Worker.State.SUCCEEDED;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

/**
 *
 * @author pc-205
 */
public class JavaFXApplication12 extends Application {

    @Override
    public void start(Stage primaryStage) {
        final WebView webview = new WebView();

        VBox layout = new VBox();
        layout.getChildren().setAll(
                createProgressReport(webview.getEngine()),
                webview
        );

        primaryStage.setScene(new Scene(layout));
        primaryStage.show();

        webview.getEngine().load("http://www.whosebug.com");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    /**
     * @return a HBox containing a ProgressBar bound to engine load progress and a Label showing load times
     */
    private HBox createProgressReport(WebEngine engine) {
        final LongProperty startTime = new SimpleLongProperty();
        final LongProperty endTime = new SimpleLongProperty();
        final LongProperty elapsedTime = new SimpleLongProperty();

        final ProgressBar loadProgress = new ProgressBar();
        loadProgress.progressProperty().bind(engine.getLoadWorker().progressProperty());

        final Label loadTimeLabel = new Label();
        loadTimeLabel.textProperty().bind(
                Bindings.when(
                        elapsedTime.greaterThan(0))
                .then(
                        Bindings.concat("Loaded page in ", elapsedTime.divide(1_000_000), "ms")
                )
                .otherwise(
                        "Loading..."
                )
        );

        elapsedTime.bind(Bindings.subtract(endTime, startTime));
        engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
            @Override
            public void changed(ObservableValue<? extends Worker.State> observableValue, Worker.State oldState, Worker.State state) {
                switch (state) {
                    case RUNNING:
                        startTime.set(System.nanoTime());
                        break;

                    case SUCCEEDED:
                        endTime.set(System.nanoTime());
                        break;
                }
            }
        });

        HBox progressReport = new HBox(10);
        progressReport.getChildren().setAll(
                loadProgress,
                loadTimeLabel
        );
        progressReport.setPadding(new Insets(5));
        progressReport.setAlignment(Pos.BASELINE_CENTER);

        return progressReport;
    }

}

该程序将有助于跟踪加载网页的进度和时间。 createProgressReport returns 包含进度条和标签的 HBox。进度条显示加载了多少页面。加载页面时,标签将显示 "loading...",完成后将显示加载页面 毫秒 的总时间