难以处理 NULL 异常并在 JXBrowser 中更改 HTML

Difficulty handling NULL exceptions and changing HTML within JXBrowser

我最近开始使用 JXBrowser 构建编辑距离的可视化 (Levenshtein)。我正在使用 JXBrowser 将 JAVA 与 HTML、CSS 和 JS 集成。

我的应用程序通过加载我的开始屏幕从 MainFrame class 开始,特别是 hello.html。

public MainFrame() {

    final Browser browser = new Browser();
    BrowserView view = new BrowserView(browser);

    JFrame frame = new JFrame("JxBrowser - EditDistance");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.add(view, BorderLayout.CENTER);
    frame.setSize(500, 400);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    InputStream urlStream = getClass().getResourceAsStream("../web/hello.html");
    String html = null;
    try (BufferedReader urlReader = new BufferedReader(new InputStreamReader (urlStream))) {
        StringBuilder builder = new StringBuilder();
        String row;
        while ((row = urlReader.readLine()) != null) {
            builder.append(row);
        }
        html = builder.toString(); 
    }  catch (IOException e) {
        throw new RuntimeException(e);
    }

    browser.loadHTML(html);

    DOMDocument document = browser.getDocument();
    final DOMElement documentElement = document.getDocumentElement();
    if (documentElement != null) {
        try{
            DOMElement element = documentElement.findElement(By.id("button"));
            element.addEventListener(DOMEventType.OnClick, new DOMEventListener() {
                public void handleEvent(DOMEvent event) {
                    new UserInput();
                }
            }, false);
        }catch(NullPointerException e){
            System.out.println("NULLL on Entry");
        }

    }        

}

然后我调用 UserInput() 并且没有抛出 Null 错误。然后,我使用与上述相同的方法加载我的 UserInputForm class,而不是使用 UserInputForm.html 作为我的视图。

 InputStream urlStream = getClass().getResourceAsStream("../web/UserInputForm.html");
    String html = null;
    try (BufferedReader urlReader = new BufferedReader(new InputStreamReader (urlStream))) {
        StringBuilder builder = new StringBuilder();
        String row;
        while ((row = urlReader.readLine()) != null) {
            builder.append(row);
        }
        html = builder.toString(); 
    }  catch (IOException e) {
        throw new RuntimeException(e);
    }

    browser.loadHTML(html);


    final DOMDocument document = browser.getDocument();
    final DOMElement documentElement = document.getDocumentElement();
    if (documentElement != null) {
        DOMElement submitElement = documentElement.findElement(By.id("enterButton"));
        if (submitElement != null) {
            submitElement.addEventListener(DOMEventType.OnClick, new DOMEventListener() {
                public void handleEvent(DOMEvent event) {
                    DOMElement source = document.findElement(By.id("sourceString"));
                    DOMElement target = document.findElement(By.id("targetString"));

                }}, false);
        }
        else{
            System.out.println("NULL on Sub Form");
        }
    }

}   

问题主要发生在加载UserInputForm 时。我通过 submitElement 文档元素得到一个 NULL returned。有时我在应用程序启动时得到 NULL returned。我觉得在加载这些表格时我缺少一个基本程序。有没有人知道如何确保文档元素不 return NULL?这是我的 HTML 加载技术的问题吗?

Browser.loadHTML() 方法作为加载特定 HTML 的请求异步执行。所以这个方法returns.

时不能保证网页加载完全

在加载的网页上访问DOM文档之前,需要等待网页完全加载。如果网页未完全加载,DOM 文档或一些 DOM 元素可能会损坏或丢失。

以下示例代码演示了如何加载 HTML 并等待它完全加载:

// Blocks current thread execution and waits until the web page is loaded completely
Browser.invokeAndWaitFinishLoadingMainFrame(browser, new Callback<Browser>() {
    @Override
    public void invoke(Browser value) {
        value.loadHTML("<html><body>Your HTML goes here</body></html>");
    }
});

注意:此方法仅用于加载网页。

以下文章介绍了如何加载网页并等待其完全加载:https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013107-loading-waiting