1

我有一个相当简单的 JavaFX 应用程序。它有一个窗口,一分为二。左边是一个表格视图,列出了数据库中的行。当您选择其中一行时,它会在右侧的 web 视图中显示 XML(也来自数据库)。到现在为止还挺好。我一辈子都无法让任何形式的 JavaScipt 工作。我的最终目标是让搜索和突出显示工作(就像在这篇很棒的帖子中一样。基于我在那里的问题,我想我会尝试通过将一个简单的 JavaScript 函数插入 HTML 来简化问题。

如果相关,我正在使用 FXML。我有一个按钮,它的 OnAction 属性调用此方法:

    @FXML
    private void searchBrowser() {
        if (webEngine.getDocument() != null) {
            highlight(searchField.getText());           
        } 
    }

    @FXML
    private void highlight(String text) {
        webEngine.executeScript("test()");

它不会抛出任何错误,并且两种方法都按顺序调用。只是没有其他事情发生。test() 函数在 HTML 中,只是一个简单的警报。如果我只是保存 HTML 并将其加载到 Chrome 或 IE 中,则该功能可以正常工作。我究竟做错了什么?

4

1 回答 1

2

首先,我找不到修复旧版本的简单方法webView.getEngine().loadContent();

但我决定在我的项目中推出相同的功能。我的要求是语法突出显示选定的文本突出显示,所以这就是我想出的:(代码并没有真正优化,只是工作并演示了它是如何完成的)

这是 1 篇文章的巨大代码,所以我将只解释基本部分并发布演示 git 链接。Java git 路径。,资源 git 路径

  • 用于语法高亮的 Google-code-prettify 库
  • 用于选定文本突出显示的 JQuery + 2 js 函数。
  • 最初我template HTML将文件作为字符串加载并修复 css 和 js 链接,因为我将它们存储在本地并且不知道如何在 html 中设置相对路径
  • 然后我html encoded XML用模板 HTML换行

在此处输入图像描述

旧帖子仅适用于webView.getEngine().load()

我不知道test()js 函数里面是什么,但是这段代码对我来说看起来不错。问题可能出在您将 js 附加到页面时,因为webView.getEngine().load()webView.getEngine().loadContent();都是异步任务,因此您必须像这样添加侦听器:

webView.getEngine().getLoadWorker().stateProperty().addListener(
            new ChangeListener<Worker.State>() {
                public void changed(ObservableValue ov, 
                                    Worker.State oldState, Worker.State newState) {
                    if (newState == Worker.State.SUCCEEDED) {
                        //some append js code here
                    }
                }
            });

这是工作演示代码:https ://gist.github.com/varren/1fb41536f2b95f69be4e

于 2015-06-11T08:55:58.480 回答