How can i get the data which has been generated using load html feature of JavaFx WebView?

百般思念 提交于 2020-05-31 06:17:11

问题


I have a JavaFx Application where I am loading the HTML page. The HTML generates a Base64 which is being written to a file once it is loaded using Javascript bridge. I am trying to get this Base64 data once it is written from the main class. Can anyone please let me know how can i achieve it ?

Below is the code

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

        }
    }
}

回答1:


Finally i was able to get the result. I kept the alert statement after the canvas image base64 text generated in html. I used webEngine.setOnAlert method to check if the alert was executed and then printed the html. I got the correct response. Below is the code

HTML

alert("ready");

JavaFx Application

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

                    });


来源:https://stackoverflow.com/questions/61320938/how-can-i-get-the-data-which-has-been-generated-using-load-html-feature-of-javaf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!