Search code examples
javafilewebviewjavafx-2href

JavaFX (2.2) loading a String from memory into a WebView


I have to display some value with JavaFX (2.2) WebView. But value have to query form data base. This value may contain some reference to external web page and internal local file. How can make enable users to open those web pages and local files with WebView. Thanks.

  WebView wv = new WebView();
    wv.getEngine().setCreatePopupHandler(new Callback<PopupFeatures, WebEngine>() {

        @Override
        public WebEngine call(PopupFeatures p) {
            Stage stage = new Stage(StageStyle.UTILITY);
            WebView wv2 = new WebView();
            stage.setScene(new Scene(wv2));
            stage.show();
            return wv2.getEngine();
        }
    });

    String value = "<a href='http://stackoverflow.com' target='_blank'>Open a URL</a>" +
                      " <a href=\"file:///C:\\Users\\Dev\\debug.log\">Open a File</a> ";

    wv.getEngine().loadContent(value);

    StackPane root = new StackPane();
    root.getChildren().add(wv);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show(); 

Solution

  • I have got resolved this issue as following manner. For make this enable following stackoverflow post was very helpful. Thanks.

        // Set HostService inherit from Application class 
        ServiceUtil.hostServices = getHostServices();
    
        // HTML code
        final String htmlCode = "<a href='http://stackoverflow.com ' target='_blank'>Open a Web URL</a>" +
                                "<a href=\"file:///C:\\Users\\Dev\\debug.log\">Open a Local File</a> ";
    
        // Create a WebView 
        final WebView webView = new WebView();        
    
        webView.getEngine().loadContent(htmlCode);
    
        webView.getEngine().locationProperty().addListener(new ChangeListener<String>() {
             @Override
             public void changed(ObservableValue<? extends String> observable, final String oldValue, final String newValue) {
    
                          if((newValue != null) && (!newValue.trim().equals(""))) {
    
                              Platform.runLater(new Runnable() {
    
                                  @Override
                                  public void run() {
    
                                      // Reset content as HTML codes
                                      // NB: This will make stop opening URL in WebView
                                      webView.getEngine().loadContent(htmlCode);
    
                                      // Direct URL to local browser
                                      ServiceUtil.hostServices.showDocument(newValue);
                                  }
                              });
                          }
                      }
         });