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

时间:2017-12-08 13:40:35

标签: java html swing nullpointerexception jxbrowser

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

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

p{
    text-align:justify;
    -ms-word-break: break-all; 
    word-break: break-all; 
    word-break: break-word; 
   -webkit-hyphens: auto; 
   -moz-hyphens: auto; 
   hyphens: auto;
}

然后我调用UserInput()并且不会抛出Null错误。然后,我使用与上面相同的方法加载我的UserInputForm类,而不是使用UserInputForm.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");
        }

    }        

}

问题主要发生在UserInputForm加载时。我得到了submitElement文档元素返回的NULL。有时我会在应用程序启动时返回NULL。在加载这些表单时,我觉得我错过了一个基本的过程。有没有人有任何洞察力确保文档元素不会返回NULL?这是我的HTML加载技术的问题吗?

1 个答案:

答案 0 :(得分:0)

Browser.loadHTML()方法作为加载特定HTML的请求异步执行。因此,无法保证在此方法返回时网页已完全加载。

在加载的网页上访问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