2017-02-04 4 views
0

Это мой первый вопрос здесь, поэтому я надеюсь быть ясным. Я разрабатываю простое приложение JavaFX, единственное, что ему нужно сделать - это показать веб-интерфейс пользователя. Кажется, что все будет в порядке, я экспортировал Runnable JAR файл из Eclipse, и я испытал его на окно 10 и 7, но когда я поставил банку на Window XP OS, у меня есть следующие:Java WebView генерирует исключение в Windows XP

Exception in Application start method 
Exception in thread "main" java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa 
der.java:58) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
     at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherIm 
pl.java:917) 
     at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(
LauncherImpl.java:182) 
     at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.UnsatisfiedLinkError: Invalid URL for class: rsrc:com/sun/g 
lass/utils/NativeLibLoader.class 
     at com.sun.glass.utils.NativeLibLoader.loadLibraryFullPath(NativeLibLoad 
er.java:162) 
     at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoad 
er.java:94) 
     at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java: 
39) 
     at com.sun.webkit.WebPage.lambda$static$39(WebPage.java:130) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at com.sun.webkit.WebPage.<clinit>(WebPage.java:129) 
     at javafx.scene.web.WebEngine.<init>(WebEngine.java:879) 
     at javafx.scene.web.WebEngine.<init>(WebEngine.java:866) 
     at javafx.scene.web.WebView.<init>(WebView.java:273) 
     at application.Main.start(Main.java:30) 
     at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162 
(LauncherImpl.java:863) 
     at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Platfor 
mImpl.java:326) 
     at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl. 
java:295) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformI 
mpl.java:294) 
     at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatch 
er.java:95) 
     at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
     at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.ja 
va:191) 
     ... 1 more 

Вот мой код:

package application; 

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.event.EventHandler; 
import javafx.stage.Stage; 
import javafx.util.Callback; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Alert; 
import javafx.scene.control.ButtonType; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.control.Alert.AlertType; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebEvent; 
import javafx.scene.web.WebView; 


public class Main extends Application { 
    @Override 
    public void start(Stage stage) 
    { 
     stage.setMinWidth(800); 
     stage.setMinHeight(600); 
     stage.setMaximized(true); 
     Scene scene = new Scene(new Group()); 

     WebView browser = new WebView(); 
     WebEngine we = browser.getEngine(); 

     //setting personalized context menu 
     browser.setContextMenuEnabled(false); 
     //createContextMenu(browser); 

     //preventing bug when maximmizing 
     stage.maximizedProperty().addListener(new ChangeListener<Boolean>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) 
      { 
       System.out.println("maximized:" + t1.booleanValue()); 
      } 
     }); 

     //intercepting javascript alert 
     browser.getEngine().setOnAlert(new EventHandler<WebEvent<String>>() 
     { 

      @Override 
      public void handle(WebEvent<String> e) 
      { 
       Alert alert = new Alert(AlertType.WARNING); 
       alert.setTitle("MyApp"); 
       alert.setHeaderText(null); 
       alert.setContentText(e.getData()); 
       alert.showAndWait(); 
       System.out.println("JS alert() message: " + e.getData()); 
      } 

     }); 

     //intercepting javascript confirm 
     browser.getEngine().setConfirmHandler(new Callback<String, Boolean>() 
     { 
      @Override 
      public Boolean call(String s) 
      { 
       Boolean ret; 
       ButtonType ok, cancel; 

       ok = new ButtonType("Ok"); 
       cancel = new ButtonType("Abort"); 

       Alert alert = new Alert(AlertType.CONFIRMATION); 
       alert.setTitle("SameLAB"); 
       alert.setHeaderText(s); 
       alert.setContentText(null); 
       alert.getButtonTypes().setAll(ok, cancel); 
       alert.showAndWait(); 

       if(alert.getResult() == ok) 
        ret = true; 
       else 
        ret = false; 

       return ret; 
      } 
     }); 


     ScrollPane sp = new ScrollPane(); 
     sp.setFitToWidth(true); 
     sp.setFitToHeight(true); 
     sp.setContent(browser); 

     //loading and showing content 
     we.load("https://www.google.it/"); 
     scene.setRoot(sp); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 
} 

Надежда, что кто-то кал помочь мне, спасибо!

+0

, которая установлена ​​версия Java в окне WinXP? –

+0

https://community.oracle.com/thread/2283029 –

+0

@JimGarrison на машине WinXP Я обновил Java до последней версии версии: 1.8.0_121, и, конечно же, я создал файл jar с относительной JRE (1.8.0_121 32 бит) –

ответ

0

Я столкнулись с этой проблемой сегодня после обновления до последней версии JDK 121. Аналогичная проблема с раннего выпуска JDK 122.

Как сейчас WebView и HTMLEditor отлично работает при использовании JDK 77 (вероятно, некоторые более поздние версии тоже (как указано в ссылке ниже - 102), но я не проверял ее). Проблема с библиотекой загрузки NativeLibLoader.loadLibrary ("jfxwebkit"); Были некоторые неопределенные предложения, которые могут помочь некоторые новые распространяемые Microsoft Visual C++.

Отредактировано. Это уже в bugreport: https://bugs.openjdk.java.net/browse/JDK-8170084 и, увы, закрыто с разрешением: «Не исправим».

Итак, один из вариантов - оставить в комплекте JRE версию 1.8.0_102 или меньше для Windows XP.

+0

Thats much RoK, я попробую ваше решение. Может быть, это немного пойдет не так, потому что я думаю, что WebView в W XP будет использовать Internet Explorer 8, поэтому поддержка бутстрапов и поддержка jquery тоже не будут показаны, но спасибо за вашу помощь :) –

+0

Извините, Matt Chad, Я перепутал с версиями JDK в своем проекте, а второе обходное решение с System.load не работает актуально. Только сначала в комплекте JRE. Я рекомендую оболочку Launch4j. – RoK

0

Итак, один из вариантов - оставить в комплекте JRE версию 1.8.0_102 или меньше для Windows XP. Другой временный грязный вариант: расслоение приложения с jfxwebkit.dll из 1.8.0_102 и добавить где-то в коде, прежде чем WebView экземпляр, созданный (например, в начале (метод Stage primaryStage))

if ("Windows XP".equals(System.getProperty("os.name"))){ 
System.load(ABS_PATH_TO_JFXWEBKIT_DLL + "\\jfxwebkit.dll");} 
+0

Попробуй! Спасибо! :) –

Смежные вопросы