我如何获得使用JavaFx WebView的load html功能生成的数据?

问题描述 投票:0回答:1

我有一个JavaFx应用程序,正在其中加载HTML页面。 HTML会生成Base64,一旦使用Javascript桥加载该文件,就会将该Base64写入文件。我试图从主类写入此Base64数据。谁能让我知道我该如何实现?

下面是代码

Test.java

public class Test {

    public static void main(String[] args) throws InterruptedException {
    String input = "[{'name': 'sub','description': 'sub','length': 25,'diameter': {'outer': 0.5,'inner': 0}},{   'name': 'jar','description': 'jar','length': 25,'diameter': {'outer': 0.5,'inner': 0}},{'name': 'sub','description': 'sub','length': 15,'diameter': {'outer': 0.5,'inner': 0}},{'name': 'drill pipe','description': 'drill pipe','length': 35,'diameter': {'outer': 0.5,'inner': 0}},{'name': 'sub','description': 'sub','length': 20,'diameter': {'outer': 0.5,'inner': 0}},{'name': 'stabilizer','description': 'stabilizer','length': 35,'diameter': {'outer': 0.5,'inner': 0}},{'name': 'mwd','description': 'mwd','length': 25,'diameter': {'outer': 0.5,'inner': 0}},{'name': 'sub','description': 'sub','length': 10,'diameter': {'outer': 0.5,'inner': 0}},{'name': 'sub','description': 'sub','length': 10,'diameter': {'outer': 0.5,'inner': 0}}]";

            new Thread() {
                @Override
                public void run() {
                    String args[] = {"--inputData=" + input};
                    JavaFxApplication.main(args);

                    Platform.runLater(new Runnable() {
                      @Override
                      public void run() {
                          getBase64Data();
                      }
                    });
                }
            }.start();

    private static void getBase64Data() {
             System.out.println("Done");
         try {
                File exisitingFile = new File(Paths.get("Output").toAbsolutePath()+"/Base64.txt");
            System.out.println("is File Exists="+exisitingFile.exists());
                    if(exisitingFile.exists()){
                    InputStream is = new FileInputStream(new File(Paths.get("Output").toAbsolutePath()+"/Base64.txt"));
                    BufferedReader buf = new BufferedReader(new InputStreamReader(is));

                    String line = buf.readLine();
                    StringBuilder sb = new StringBuilder();

                    while(line != null){
                      sb.append(line).append("\n");
                      line = buf.readLine();
                    }
                    String fileAsString = sb.toString();
                    buf.close();
                    System.out.println("Valid Base64 : " + fileAsString);
                    FileUtils.forceDelete(exisitingFile);
                    }
        } catch (IOException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            System.exit(0);
        }

       }
}
}

JavaFxApplication.java

public class JavaFxApplication extends Application {

    private JavaBridge javaBridge = new JavaBridge();

    @Override
    public void start(Stage primaryStage) throws Exception {
        try {

            String path = Paths.get("Input/BHAEditor").toAbsolutePath()+File.separator+"OriginalCanvas.html";
            Parameters parameters = getParameters();
            Map<String, String> named = parameters.getNamed();
            String inputData = named.get("inputData");
            System.out.println("inputData=" + inputData);
            WebView webView = new WebView();
            WebEngine webEngine = webView.getEngine();
            webEngine.setJavaScriptEnabled(true);
            webView.setContextMenuEnabled(true);
            webView.getEngine().setOnError(event -> System.out.println(event.getMessage()));
            webView.getEngine().setOnAlert(event -> System.out.println(event.getData()));
            webView.getEngine().locationProperty()
                    .addListener((observable, oldValue, newValue) -> System.out.println(newValue));
            Scene scene = new Scene(webView, 600, 600);
            primaryStage.setScene(scene);
            primaryStage.setTitle("Hello World");
            // primaryStage.show();

            File f = new File(path);

            webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
                @Override
                public void changed(@SuppressWarnings("rawtypes") ObservableValue ov, State oldState, State newState) {
                    if (newState == Worker.State.SUCCEEDED) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        String javaScript = "BHAEditorDemo(" + inputData + ")";

                        webEngine.executeScript(javaScript);

                        JSObject jsobj = (JSObject) webEngine.executeScript("window");
                        jsobj.setMember("bridge", javaBridge);

                    }
                }
            });
            webEngine.load(f.toURI().toString());

            webEngine.setOnError((event) -> {
                System.out.println(event.getMessage());
            });

        } catch (Exception ex) {

            System.err.print("error " + ex.getMessage());
            ex.printStackTrace();
        }

        WebConsoleListener.setDefaultListener((webView, message, lineNumber, sourceId) -> {
            System.out.println(message + "[at " + lineNumber + "]");
        });

    }

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

    public class JavaBridge {
        public void generateBase64(String base64) throws IOException {
            OutputStream os = null;
            try {
                File exisitingFile = new File(Paths.get("Output").toAbsolutePath()+"/Base64.txt");
                if(exisitingFile.exists()) {
                    FileUtils.forceDelete(exisitingFile);
                }
                os = new FileOutputStream(new File(Paths.get("Output").toAbsolutePath() + "/Base64.txt"));
                os.write(base64.getBytes(), 0, base64.length());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}
javafx javafx-8 javafx-webengine
1个回答
0
投票

最后,我能够得到结果。在html生成的canvas图像base64文本之后,我保留了警报声明。我使用webEngine.setOnAlert方法检查警报是否已执行,然后打印html。我得到了正确的答复。下面是代码

HTML

alert("ready");

JavaFx应用程序

webEngine.setOnAlert(new EventHandler<WebEvent<String>>(){

                        @Override
                        public void handle(WebEvent<String> event) {
                            //labelWebTitle.setText(webEngine.getTitle());
                             if("ready".equals(event.getData())){
                                 //TODO: initialize
                                 System.out.println("HTML Ready");
                                 WebEngine engine = (WebEngine)event.getSource();
                                 String html = (String) engine.executeScript("document.documentElement.outerHTML");
                                 org.jsoup.nodes.Document doc = Jsoup.parse(html);
                                 Element image = doc.getElementById("canvasImage");
                                 System.out.println(image.attr("src"));
                            }
                        }

                    });
© www.soinside.com 2019 - 2024. All rights reserved.