【问题标题】:JavaFX, Gluon : HTML file not loaded from Java code in APKJavaFX,Gluon:未从 APK 中的 Java 代码加载的 HTML 文件
【发布时间】:2016-02-12 10:26:02
【问题描述】:

安装 Gluon 插件后,我在 Intellij Idea 上有一个 Gluon JavafX 项目,其中我在 JavaFX 的 Webkit 浏览器中加载了一些静态 HTML 文件。

现在,当我直接启动 JavaFX 应用程序时,我可以看到正在加载的 HTML,但是当我创建 APK 时,我看不到正在加载的 HTML。我尝试了两个路径,即html/index.htmlindex.html,但是对于这两个 APK 都没有在应用程序中显示任何内容,它只是加载了一个黑屏。

根据我之前关于 Gluon 的问题,我已将静态内容移动到资源目录中。这大大增加了 APK 的大小,这证实了静态内容在 APK 内。

这是主类:

@Override
public void start(Stage primaryStage) throws Exception{
    primaryStage.setTitle("Rewe - Frontend");
    java.net.CookieManager manager = new java.net.CookieManager();
    java.net.CookieHandler.setDefault(manager);

    myBrowser = new MyBrowser();
    scene = new Scene(myBrowser, 1080, 1920);

    primaryStage.setScene(scene);
    primaryStage.setFullScreen(true);
    primaryStage.show();

}

我的浏览器.Java:

public class MyBrowser extends Region {

    final String hellohtml = "index.html";

    WebView webView = new WebView();
    WebEngine webEngine = webView.getEngine();
public MyBrowser() {
        webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue == Worker.State.SUCCEEDED) {
                JSObject window = (JSObject) webEngine.executeScript("window");
                window.setMember("app", this);
            }
        });

        URL urlHello = getClass().getResource(hellohtml);

        webEngine.load(urlHello.toExternalForm());
        webView.setPrefSize(1080, 1920);
        webView.setContextMenuEnabled(false);
}

这是显示相应文件夹中的静态文件和 Java 文件的屏幕截图:

那为什么当我打开 APK 时我只看到黑屏。我只是在index.htmlbody 中输入了“Hello world”,即使没有显示。你能帮忙的话,我会很高兴。谢谢你。

更新

使用 adb 的错误日志:

: QuantumRenderer: shutdown
02-12 12:49:24.539 13109 13132 W System.err: java.lang.reflect.InvocationTargetException
02-12 12:49:24.540 13109 13132 W System.err:    at java.lang.reflect.Method.invoke(Native Method)
02-12 12:49:24.540 13109 13132 W System.err:    at javafxports.android.DalvikLauncher$1.run(DalvikLauncher.java:188)
02-12 12:49:24.540 13109 13132 W System.err:    at java.lang.Thread.run(Thread.java:818)
02-12 12:49:24.540 13109 13132 W System.err: Caused by: java.lang.RuntimeException: Exception in Application start method
02-12 12:49:24.540 13109 13132 W System.err:    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
02-12 12:49:24.540 13109 13132 W System.err:    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$137(LauncherImpl.java:182)
02-12 12:49:24.540 13109 13132 W System.err:    at com.sun.javafx.application.LauncherImpl.access$lambda$1(LauncherImpl.java)
02-12 12:49:24.540 13109 13132 W System.err:    at com.sun.javafx.application.LauncherImpl$$Lambda$2.run(Unknown Source)
02-12 12:49:24.540 13109 13132 W System.err:    ... 1 more
02-12 12:49:24.540 13109 13132 W System.err: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.net.URL.toExternalForm()' on a null object reference
02-12 12:49:24.541 13109 13132 W System.err:    at com.rewetest.MyBrowser.<init>(MyBrowser.java:69)
02-12 12:49:24.541 13109 13132 W System.err:    at com.rewetest.Main.start(Main.java:30)
02-12 12:49:24.541 13109 13132 W System.err:    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$144(LauncherImpl.java:863)
02-12 12:49:24.541 13109 13132 W System.err:    at com.sun.javafx.application.LauncherImpl.access$lambda$8(LauncherImpl.java)
02-12 12:49:24.541 13109 13132 W System.err:    at com.sun.javafx.application.LauncherImpl$$Lambda$9.run(Unknown Source)
02-12 12:49:24.541 13109 13132 W System.err:    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$157(PlatformImpl.java:326)

【问题讨论】:

  • 你在桌面上试过了吗?如果它在桌面上不起作用,那是因为一个已知的错误。
  • @JoséPereda:当我只有一个没有 Gluon 的 JavaFX 项目时,它可以正常工作。现在,当我将项目作为应用程序加载时,我得到一个错误,未指定 Android SDK。虽然我已经在 jfxMobiel{android{ //here}} 中指定了。
  • @JoséPereda:我可以为您提供 Main 和 MyBrowser 的 Java 文件。您可以尝试使用自己的 html 来查看哪些路径有效吗?
  • 能否在桌面上运行?为了在 Android 上运行,首先它也应该在桌面上运行。只需在 Gradle 选项卡上选择 run 任务,看看是否有效。如果没有,请先解决问题。
  • 我可以在桌面上运行..没问题。

标签: java android javafx gluon


【解决方案1】:

如果你使用

webEngine.load(getClass().getResource("index.html").toExternalForm()); 

您需要将资源与该类放在同一个包中:

src/main/resources/com/<your package>

或者如果你想把它放在不同的文件夹中,使用“/”作为资源的根目录:

webEngine.load(getClass().getResource("/html/index.html").toExternalForm());

这将解决 NPE。

我没有在您的代码中看到它,但我认为您正在将 WebView 添加到场景中:

public MyBrowser() {
     ...
     getChildren().add(webView);
}

【讨论】:

  • 如果我把它放在 src/java/resources/com/package-name 中,就像你之前说你看不到 Java 文件的地方,那么 APK 就不会选择它。我必须把它放在 src/main/resources 中以供 APK 获取。我有你在代码中提到的构造函数,前面没有问题。
猜你喜欢
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
相关资源
最近更新 更多