【问题标题】:JavaFX app icon fails to show 9/10 timesJavaFX 应用程序图标无法显示 9/10 次
【发布时间】:2016-11-05 11:25:22
【问题描述】:

我有一个应用程序可以正常打开,但无法为其设置图标。我提供路径的图标在那里,并且在该目录中更改为另一个图像会显示该图标 9/10 次,但该图像从未显示。它的位置总是有一个问号。所以即使在另一个文件上,我知道它可以工作(即没有损坏),为什么它只显示这么少?

下面是MyApplication.java的代码

package MyApp;

import MyApp.Variables.Constants;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("Forms/FormMain.fxml"));

        primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("/img/appicon.png")));
        primaryStage.setTitle("MyApp " + Constants.VERSION_NAME + " (" + Constants.RELEASE_ID + ")"); 
        primaryStage.setScene(new Scene(root, 1000, 800));
        primaryStage.show();
    }

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

下面是 /img/ 与 Main.java 相关的项目目录结构:

我已经尝试了所有解决方案here,但没有解决我的问题。

在 Ubuntu 16.04 上运行,用于 IDE 的 IntelliJ IDEA,但导出的 JAR 文件仍然存在问题。

【问题讨论】:

  • 如果有效,请使用 [new Image("File:/img/appicon.png")]。还要检查这个download.java.net/jdk8/jfxdocs/javafx/scene/image/Image.html,因为你必须使用[new Image(getClass().getResourceAsStream("/img/appicon.png");]
  • 恐怕这行不通。我已经查看了文档,但我不确定能从中获得什么,我尝试使用各种构造函数,传入流而不是字符串,后台加载,没有任何效果。
  • 当您将其导出为 jar 时,您必须使用 new Image(getClass().getResourceAsStream("/img/appicon.png"); 将其作为流获取你的项目建成了吗?
  • 图片已添加到主帖。我已将代码更改为使用 getClass().getResourceAsStream(...) 但仍然无济于事。
  • 使用构造函数Main() 并在变量中加载带有new Image(MainApp.class.getResource(filename with extension).toExternalForm()) 的图标。在您的 start() 方法中,将变量添加到您的图标中。

标签: java image javafx icons stage


【解决方案1】:

从磁盘加载数据非常耗时,因此您可以在构建对象时开始加载图标。将它放在构造函数中并将其保存在实例成员中。通常您需要添加多个图标,因为每个平台都需要自己的大小(用于链接等)。

package MyApp;

import MyApp.Variables.Constants;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public class Main extends Application {

    private Image icon;

    public Main() {
      icon = new Image(Main.class.getResource("/img/appicon.png").toExternalForm());
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("Forms/FormMain.fxml"));

        primaryStage.getIcons().add(icon);
        primaryStage.setTitle("MyApp " + Constants.VERSION_NAME + " (" + Constants.RELEASE_ID + ")"); 
        primaryStage.setScene(new Scene(root, 1000, 800));
        primaryStage.show();
    }

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

我的图标是这样的: Netbeans 中的应用程序结构如下所示:

运行的应用看起来像这样:

【讨论】:

  • getResource 只接受一个字符串,它拒绝不带任何参数。
  • 我确实在您进行编辑时尝试过 - 由于本机代码中的 InvocationTargetException 以及来自 getResource 的 NullPointerException 为空,它仍然无法构造应用程序实例等。删除开头的句号会导致 getResource 不再为空,应用程序启动,但图标仍然不显示。
  • 嗯,我已经做了一些要点,在我的机器上它正在运行并显示应用程序图标。也许您需要加载更多不同分辨率的图标,如 16、22、24、32、48 等。这对于其他平台(如 Mac 或 Windows)来说是必需的,在这些平台上,您在不同的地方有不同的图标大小。
  • 好的,我会调查的。非常感谢您的努力!
  • 所以添加我希望图标的大小使其更有效,但仍然只是有时。例如,我将其设为 16x16,运行它,图标显示。关闭它,再次运行它而不做任何更改,默认图标显示而不是我的。
猜你喜欢
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
相关资源
最近更新 更多