Java WebView没有显示任何内容

Java WebView没有显示任何内容,java,javafx-8,Java,Javafx 8,我有一个非常简单的应用程序,它在tableview中列出数据库中的行。当用户单击该列表中的一行时,应用程序将从该行获取XML列,并将其显示在同一窗口的WebView中。除了实际显示XML之外,其他一切都可以正常工作。我在这件事上绞尽脑汁已经有一段时间了,但我一事无成。以下是侦听器调用的代码: @FXML private void showXML(QueryRow row) { String msg = ""; try {

我有一个非常简单的应用程序,它在tableview中列出数据库中的行。当用户单击该列表中的一行时,应用程序将从该行获取XML列,并将其显示在同一窗口的WebView中。除了实际显示XML之外,其他一切都可以正常工作。我在这件事上绞尽脑汁已经有一段时间了,但我一事无成。以下是侦听器调用的代码:

    @FXML
    private void showXML(QueryRow row) {

        String msg = "";
        try {
            msg = mainApp.getMsg(row.getID().get());
        } catch (SQLException e) {
            e.printStackTrace();
        }
        final String fm = msg;

        System.out.println(msg);

        //tb.setText(msg);

        webEngine = webView.getEngine();
//      webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
//        
//          public void changed(ObservableValue ov, State oldState, State newState) {
//
//            if (newState == Worker.State.SUCCEEDED) {
//              System.out.println("inside");
//              webEngine.load(fm);
//              //stage.setTitle(webEngine.getLocation());
//            }
//
//          }
//        });
        System.out.println("Go baby go!");
        webEngine.load(fm);

    }
@FXML
私有void showXML(QueryRow行){
字符串msg=“”;
试一试{
msg=mainApp.getMsg(row.getID().get());
}捕获(SQLE异常){
e、 printStackTrace();
}
最终字符串fm=msg;
System.out.println(msg);
//tb.setText(msg);
webEngine=webView.getEngine();
//webEngine.getLoadWorker().stateProperty().addListener(新的ChangeListener()){
//        
//公共无效已更改(ObservalEvalue ov、State oldState、State newState){
//
//if(newState==Worker.State.successed){
//系统输出打印项次(“内部”);
//webEngine.load(fm);
////stage.setTitle(webEngine.getLocation());
//            }
//
//          }
//        });
System.out.println(“加油,宝贝加油!”);
webEngine.load(fm);
}

我缺少什么?

如果您想加载XML并且
fm
不是链接,那么您可能应该使用

webEngine.loadContent(fm);

/**
 * Loads the given HTML content directly. This method is useful when you have an HTML
 * String composed in memory, or loaded from some system which cannot be reached via
 * a URL (for example, the HTML text may have come from a database). As with
 * {@link #load(String)}, this method is asynchronous.
 */
public void loadContent(String content) {
    loadContent(content, "text/html");
}
但这不会使xml可见,因此如果您希望显示xml,则必须将其放在某个默认html页面中。大概是这样的:

或者简单的方法:

webEngine.loadContent(
         <textarea readonly style='width:100%; height:100%'>"+ fm +"</textarea>")
webEngine.loadContent(
“+fm+”)

好的,我刚刚测试了一点。text/html是正确的方法,但您需要对xml数据做一些工作:您必须转义xml实体(我使用commons-lang3 StringEscapeUtils),然后将所有内容包装在预格式化的html字符串中:

public class JavaFXTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Test to display XML");

        BorderPane content = new BorderPane();
        WebView webView = new WebView();
        WebEngine webEngine = webView.getEngine();

        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<tag1>\n  <tag2>hello</tag2>\n</tag1>";
        String escaped = StringEscapeUtils.escapeHtml4(xml);
        String html = "<html><head></head><body><pre>" + escaped + "</pre></body>";

        webEngine.loadContent(html, "text/html");

        content.setCenter(webView);
        primaryStage.setScene(new Scene(content, 400, 300));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
public类JavaFXTest扩展应用程序{
@凌驾
public void start(Stage primaryStage)引发异常{
setTitle(“测试以显示XML”);
边框窗格内容=新建边框窗格();
WebView WebView=新建WebView();
WebEngine WebEngine=webView.getEngine();
字符串xml=“\n\n hello\n”;
转义字符串=StringEscapeUtils.escapeHtml4(xml);
字符串html=“”+转义+”;
loadContent(html,“text/html”);
content.setCenter(webView);
初级舞台.场景(新场景(内容,400300));
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
这将生成以下窗口:


另外:在转义之前,您可能需要在xml上进行一些漂亮的打印;我只是使用了硬编码的换行符和空格。

好吧,loadContent是一个很好的开始。奇怪的是,xml显示完全未格式化,没有标记。但是我比以前更接近了,谢谢!它不应该是内容类型“text/xml”而不是“text”吗/html'?@P.J.Meisch我相信“text/xml”仍然解释xml标记,因此您将看到
test
,而不是
test
,因此您需要将xml放入html中以查看所有标记并使用漂亮的打印。以下是更多信息: