BYTECODES

PC客户端开发利器: 使用JavaFx WebView技术大幅提升开发效率

当前开发PC客户端技术路线还是很多,比如使用windows技术,或electronjs,或最新的tauri,flutter等。JavaFx是使用Java语言开发客户端程序的一个方案。但大部分人做Web开发的人,对于JavaFx不是很熟悉,所以往往就选择electronjs技术方案了。


Electronjs的缺点很多,但最大的优点是开发效率高。使用CSS, Html很快就能搞出漂亮的界面。所以能忍就忍吧。


我用过Electron,也用过JavaFx。我是做了很多年Java开发,用JavaFx问题不大,但谈不上熟练使用,所以开发效率是最大的问题,对于Electron的缺点经常性的无法忍受,所以时不时的在这两个技术里切换。最近研究了JavaFx的Webview技术,初步判断可以用Webview大幅提升开发效率。本质上使用Webview是使用CSS+Html来开发。需要Java的时候,JavaFx可以很好的和Javascript进行交互,互相调用,传递数据。


今天抽空做了一个小Demo,大家可以感受下。

package com.example.demo1;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

public class HelloApplication extends Application {
    @Override
    public void start(Stage stage) {
        WebView webView = new WebView();
        webView.setPrefSize(800, 600);
        WebEngine webEngine = webView.getEngine();
        webEngine.setJavaScriptEnabled(true);
        webEngine.setOnError(event -> System.out.println(event.getMessage()));
        webEngine.setOnAlert(event -> System.out.println(event.getData()));
        webEngine.getLoadWorker().stateProperty().addListener(
                new ChangeListener() {
                    @Override
                    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
                        if (newValue != Worker.State.SUCCEEDED) {
                            return;
                        }

                        JSObject window = (JSObject) webEngine.executeScript("window");
                        window.setMember("myObject", new MyObject());
                    }
                }
        );
        webEngine.load("file:///Users/shan/Documents/projects/demo/build/index.html");

        VBox vBox = new VBox(webView);
        Scene scene = new Scene(vBox, 800, 600);
        stage.setTitle("Hello!");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}