2015-01-20 4 views
0

Я кодирую веб-браузер в javafx. Я столкнулся с проблемой получения заголовка страницы, открытой в настоящее время в веб-движке. Это дает мне кучу ошибок при компиляции Programe Всякий раз, когда я называю метод GetTitle (private final String title = getTitle(webEngine);)Исключение в методе запуска приложения возникает при вызове метода

// to get title of page currently open in web engine 
private static String getTitle(WebEngine webEngine) {  
Document doc = webEngine.getDocument(); 
NodeList heads = doc.getElementsByTagName("head"); 
String titleText = webEngine.getLocation() ; // use location if page does not define a title 
if (heads.getLength() > 0) { 
    Element head = (Element)heads.item(0); 
    NodeList titles = head.getElementsByTagName("title"); 
    if (titles.getLength() > 0) { 
     Node title = titles.item(0); 
     titleText = title.getTextContent();    
    } 
} 
return titleText ; 
} 

Ошибка, которую я получаю

Exception in Application start method 
java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:363) 
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:303) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:875) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$147(LauncherImpl.java:157) 
    at com.sun.javafx.application.LauncherImpl$$Lambda$53/1598924227.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.NullPointerException 
    at com.rajat.browser.Browser.getTitle(Main.java:307) 
    at com.rajat.browser.Browser.<init>(Main.java:77) 
    at com.rajat.browser.Main.start(Main.java:53) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(LauncherImpl.java:821) 
    at com.sun.javafx.application.LauncherImpl$$Lambda$59/857338418.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(PlatformImpl.java:323) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$49/1401420256.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$52/1424777668.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$51/752848266.run(Unknown Source) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) 
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$45(GtkApplication.java:126) 
    at com.sun.glass.ui.gtk.GtkApplication$$Lambda$42/1469821799.run(Unknown Source) 
    ... 1 more 
Exception running application com.rajat.browser.Main 
Java Result: 1 

Кто-то пожалуйста, помогите мне исправить эту проблему. Я был бы очень благодарен вам. Вы также можете проверить мой проект here Спасибо :)

ответ

1

То, что вы, вероятно, действительно хотите сделать это, чтобы отследить целевое свойство WebEngine для изменения и обновить текст метки всякий раз, когда заголовок изменяется. Это похоже на то, что я сделал, когда писал web browser for JavaFX давным-давно.

webView.getEngine().titleProperty().addListener((observableValue, oldValue, newTitle) -> { 
    if (newTitle != null && !"".equals(newTitle)) { 
     label.setText(newTitle); 
    } else { 
     label.setText(""); 
    } 
}); 

Он также похож на WebView кода использования фрагмента кода, представленной в WebEngine javadoc, что SNIPPET наблюдателям свойство документа, а не права собственности:

import javafx.concurrent.Worker.State; 
final Stage stage; 
webEngine.getLoadWorker().stateProperty().addListener(
     new ChangeListener<State>() { 
      public void changed(ObservableValue ov, State oldState, State newState) { 
       if (newState == State.SUCCEEDED) { 
        stage.setTitle(webEngine.getLocation()); 
       } 
      } 
     }); 
webEngine.load("http://javafx.com"); 
+0

меня реализует код, указанный вами, но я несколько раз сталкиваюсь с какой-то странной проблемой, он может найти название веб-страницы, но иногда он показывает значение по умолчанию, которое я присвоил переменной newTitile. – codeRock

1

Чтобы найти проблему, мы должны смотреть на ваш проект, и убедитесь, что у вас есть вызов getTitle() при создании экземпляра Browser:

class Browser extends Region{ 

    private final String  title  = getTitle(webEngine); 

    private static String getTitle(WebEngine webEngine) {  
     Document doc = webEngine.getDocument(); 
     NodeList heads = doc.getElementsByTagName("head"); 
     ... 
    } 
} 

Очевидно, на данный момент webEngine пуст, и webEngine.getDocument() возвращает null. Затем NPE на следующей строке.

Решение: Проверьте, если doc является недействительным, прежде чем идти дальше

private static String getTitle(WebEngine webEngine) {  
    Document doc = webEngine.getDocument(); 
    if(doc==null){ 
     return ""; 
    } 
    ... 
}