2017-12-08 4 views
0

最近、JXBrowserを使用して距離編集のビジュアライゼーション(Levenshtein)を構築し始めました。私はJXBrowserを使ってJAVAとHTML、CSS、JSを統合しています。NULL例外を処理するのが難しく、JXBrowser内でHTMLを変更する

私のアプリケーションは、開始画面、特にhello.htmlを読み込むことでMainFrameクラスから始まります。

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.htmlを私のビューとして使用する代わりに、上記と同じ方法を使用してUserInputFormクラスをロードします。

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を取得します。場合によっては、アプリケーションの起動時にNULLが返されることがあります。私はこれらのフォームを読み込む際に基本的な手順が欠けているように感じます。誰もがドキュメント要素がNULLを返さないようにするための洞察を持っていますか?これは私のHTML読み込みテクニックの問題ですか?

答えて

0

Browser.loadHTML()メソッドは、特定のHTMLをロードする要求として非同期に実行されます。したがって、このメソッドが返されたときにWebページが完全に読み込まれるという保証はありません。

ロードされたWebページでDOMドキュメントにアクセスする前に、Webページが完全に読み込まれるまで待つ必要があります。 Webページが完全にロードされていない場合、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>"); 
    } 
}); 

注:唯一のWebページをロードするため、このアプローチを使用しています。

次の資料は、Webページをロードし、それが完全にロードされるまで待機する方法について説明します。https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013107-loading-waiting

+0

こんにちはアンナは - あなたに感謝します。私はNULLの問題を取り除くことができました。 –

+0

リンクのみ回答を投稿しないでください。リンクが移動または取り外されたときに、リンクが腐敗する可能性があります。あなたの答えに完全なコードと解決策を追加してください。 – Tschallacka

+0

@tschallackaこれを指摘してくれてありがとう。私は必要な情報で私の答えを更新しました。 –

関連する問題