如何在JavaFX中设置应用程序安装程序图标?

11

我正在使用JavaFX-Gradle-plugin来构建可分发的JavaFX应用程序的二进制文件和安装程序。当我的应用程序运行时,我可以通过以下方式设置图标:

stage.getIcons().add(new Image(this.getClass().getResourceAsStream("/isotype.png")));

如何正确地为运行中的应用程序设置图标:

在此输入图像描述

以及任务栏:

在此输入图像描述

但是如何设置开始菜单的图标:

在此输入图像描述

以及其他潜在位置的图标:

在此输入图像描述


我知道如何使用javapackager做到这一点。这对你有帮助吗,还是你需要Gradle解决方案(我不确定)? - Mordechai
4个回答

5
这里有一个已经公开的拉取请求来记录这个信息,可以在这里找到它。
它说:

自定义图标

要自定义本地捆绑包中使用的图标,您必须为相应的捆绑包提供图标。图标必须遵循文件名约定才能被拾起。

提示: 将verbose设置为true,以便记录从部署目录中选择的文件。

特别是对于 Microsoft Windows:

Windows

图标位置:src/main/deploy/windows

您可以为 Windows 提供两个不同的图标。

  • 应用程序图标
  • 安装程序的图标

| Type | Filename | | :---------------- |:------------------------- | | .exe icon | \<appName>.ico | | setup exe icon | \<appName>-setup-icon.bmp |

尽管它所说的是src/main/deploy/windows,但正确的路径应该是src/main/deploy/packages/windows,在adjusted-launcher-icon example中有展示。

谢谢。我不知道 verbose。那个图标位置似乎不正确(我尝试了它,但没用),verbose 告诉我这个:使用默认的包资源[应用程序图标](将 package/windows/Dashman.ico 添加到类路径以自定义)。到目前为止,在资源和 src 上放置它还没有起作用。我还在尝试中。 - pupeno
我也尝试了在许多目录中部署 deploy/windows/Dashman.ico,但没有任何效果。 - pupeno
我找到了正确的路径,编辑了这个问题,并在拉取请求中添加了一条评论。 - pupeno
@Pablo 太棒了! - KeatsPeeks

3
也许你的图像路径("/isotype.png")不正确。从以下选项中选择一种方法,以便提供正确的路径。如果图标图像已存储:
  • In a folder (e.g. images) then use this path "/images/isotype.png" as like:

    stage.getIcons().add(
          new Image(this.getClass().getResourceAsStream("/images/isotype.png")));
    
  • In package directory then use this path "isotype.png" as like:

    stage.getIcons().add(new Image(this.getClass().getResourceAsStream("isotype.png")));
    
  • In a folder structure then use this path "../images/isotype.png" as like:

    stage.getIcons().add(
          new Image(this.getClass().getResourceAsStream("../images/isotype.png"")));
    

更新:

您需要查看Gradle JavaFX插件指南,其中描述了Javafx包具有跨平台的特性,如启动菜单集成、dock和托盘图标、菜单栏集成和单击图标。如果您计划分发应用程序,则必须在输出文件夹中签署文件,如7.3.5中所述使用signtool.exe

现在,您需要在build.gradle文件内进行一些(图标)配置选项,例如:

javafx {
    appID 'SampleApp'
    appName 'Sample Application'
    mainClass 'com.example.sample.Main'

    jvmArgs = ['-XX:+AggressiveOpts', '-XX:CompileThreshold=1']
    systemProperties = [ 'prism.disableRegionCaching':'true' ]
    arguments = ['-l', '--fast']

    embedLauncher = false

    // deploy/info attributes
    category = 'Demos'
    copyright = 'Copyright (c) 2013 Acme'
    description = 'This is a sample configuration, it is not real.'
    licenseType = 'Apache 2.0'
    vendor = 'Acme'
    installSystemWide = true
    menu = true
    shortcut = true

    // app icons
    icons {
        shortcut = ['shortcut-16.png', 'shortcut-32.png', 'shortcut-128.png', 'shortcut-256.png', 'shortcut-16@2x.png', 'shortcut-32@2x.png', 'shortcut-128@2x.png']
        volume = 'javafx-icon.png'
        setup = 'javafx-icon.png'
    }

    // applet and webstart stuff
    debugKey {
        alias = 'debugKey'
        //keyPass = 'password' // provide via command line
        keyStore = file('~/keys/debug.jks')
        //storePass = 'password'  // provide via command line
    }
    releaseKey {
        alias = 'production'
        //keyPass = 'password' // provide via command line
        keyStore = file('/Volumes/ProdThumbDrive/production.jks')
        //storePass = 'password'  // provide via command line
    }
    signingMode 'release'

    width = 800
    height = 600
    embedJNLP = false
    codebase = 'http://example.com/bogus/JNLP/Codebase'

    // arbitrary jnlp icons
    icon {
        href = 'src/main/resources/javafx-icon.png'
        kind = 'splash'
        width = 128
        height = 128
    }
    icon {
        href = 'shortcut-32@2x.png'
        kind = 'selected'
        width = 16
        height = 16
        scale = 1
    }
}

路径是正确的,该代码仅在应用程序运行时处于活动状态,而开始菜单和卸载程序列表不需要应用程序运行。我更新了答案以显示它在应用程序运行时可以工作。 - pupeno
不,因为它不适用。 - pupeno
尝试更改您在stage.getIcons().add(new Image(this.getClass().getResourceAsStream("isotype.png")));中的目录,并制作二进制文件? - user1773603
应用程序代码对开始菜单没有影响。如果我删除“/”,它只是在启动时无法找到图标。 - pupeno
@Pablo,你可能没有在我的回答中检查链接 Gradle JavaFX插件指南,它还描述了跨平台(Windows或Mac)的正确路径。 - user1773603

0

如何进行此操作的一般步骤在此处记录: https://github.com/BilledTrain380/javafx-gradle-plugin/blob/648acafa7198e9bd7cf1a2ef933456ce5e0b65f9/README.md#customize-icons 但是,最近我遇到了使用最新版本的打包程序(实际上是 ant 任务)无法正常工作的问题。似乎有些东西出了问题,因为它可以在旧版(Java 8)的打包程序中工作,但不能在最新的版本中工作。然而,我能够通过明确指定来使其正常工作。

<fx:bundleArgument arg="icon" value="package/macosx/myapp.icns"/>

在fx:deploy部分内。我不知道如何在Gradle中实现这一点,因为我使用的是ant,但你应该能够找到解决方法。在旧版本的打包程序中,这是不必要的。


0
如果你正在使用 Ant 构建或构件来构建 JavaFX 应用程序,遵循这篇文章可能会有所帮助。

https://flaironix.com/2019/09/18/adding-custom-icon-for-javafx-application-exe-file-in-intelije/

使用 artifact 中的这个选项标签

<option name="icons">
    <JavaFxApplicationIcons>
    <option name="linuxIcon" value="$PROJECT_DIR$/src/Controller/logo.png" />
    <option name="windowsIcon" value="$PROJECT_DIR$/src/Controller/logo.ico"/>
   </JavaFxApplicationIcons>
</option>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接