JavaFX 在任务栏的图标质量问题

6
当在JavaFX中设置png图像作为舞台图标时(使用Kotlin,但这也是Java中的问题),图标似乎会变形。
我已经搜索了这个问题,并找到了以下内容:
- 这是一个(可能仍然存在的)bug。在这个issue page上,他们解释说一个解决方法是避免使用半透明像素。我尝试了这个方法,但我的图片仍然变形,如下所示。

32x32 Deformed 32x32

左侧。 原始的32x32图像提供给JavaFx。右侧。 JavaFx放置在任务栏中的图像。

Original 48x48 Deformed 48x48

左边。提供给JavaFx的原始48x48图像。右边。JavaFx在任务栏中放置的图像。

看起来32x32的图片必须被放大,而48x48的图片必须缩小到约42x42(我也制作了一个42x42但也没有帮助)。既然Windows想要的尺寸是2的幂或48x48,那么你可以说这些尺寸会起作用。

  • 我发现this 关于此主题的旧问题。在此讨论JavaFX不会自动选择最佳图标大小,而通常选择添加到图标集的最后一个图标,因此建议将您认为最适合的图标放在最后一个位置。

我知道这可能是JavaFX中未解决的错误,并且其他问题已经有大约三年没有更新了,所以我想知道是否有人在此期间找到了更好的解决方法。

我已经用Kotlin创建了一个类似于问题页面提供的MWE,您可以轻松地将原始图像与最终出现在任务栏中的图像进行比较。使用的图像如下:

  • icon48.png:原始48x48图标
  • icon32.png:原始32x32图标

MWE

class Main : Application() {
    override fun start(primaryStage: Stage) {
        val icon48 = Image("sample/icon48.png")
        val icon32 = Image("sample/icon32.png")
        primaryStage.scene = Scene(Group(
                ImageView(icon48)
                ImageView(icon32)
        ))

        primaryStage.icons.addAll(
                icon48,
                icon32
        )

        primaryStage.show()
    }
}

fun main(args: Array<String>) {
    Application.launch(Main::class.java, *args)
}

你有找到任何解决方法吗?这让我很烦恼。 - Anonymous
@Brayden,请看下面我的回答。 - PHPirate
1个回答

4
一个针对你的程序的 Windows 发布版本的解决方案(在这里最重要的地方,这对调试版本没有帮助)是使用 launch4j 和 InnoSetup。 launch4j 生成一个可执行文件,而 InnoSetup 则在其周围包装了一个安装过程。
如何为您的 JavaFX 应用程序添加漂亮的图标以供 Windows 使用(并将其固定到任务栏上) 1. 使用 Gradle,添加 launch4j 插件。例如,当使用 Kotlin Gradle DSL 时,请添加
plugins {
    // Plugin to build .exe files.
    id("edu.sc.seis.launch4j") version "2.4.4"
}

dependencies {
    // JNA, used to e.g. make a program pinnable to taskbar.
    compile("net.java.dev.jna:jna:4.5.1")
    compile("net.java.dev.jna:jna-platform:4.5.1")
}

launch4j {
    mainClassName = "nl.mynamespace.myapp.MainKt"
    icon = "$projectDir/src/main/resources/myapp32.ico"
    manifest = "$projectDir/releasing/launch4j/myapp.manifest"
}

将图标和清单文件放置在您指定的路径中,并确保清单文件包含以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
            <requestedExecutionLevel level="highestAvailable"
                uiAccess="False" />
        </requestedPrivileges>
    </security>
    </trustInfo>
</assembly> 

2. 运行Gradle任务launch4j/createExe

3. 下载InnoSetup

4. 根据您的项目调整任何配置(.iss)文件,例如以下示例:

#define MyAppName "Myapp"
#define MyAppVersion "2.0.0-beta.9"
#define MyAppPublisher "mynamespace"
#define MyAppURL "https://github.com/mynamespace/myapp"
#define MyAppExeName "myapp.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{something generated here}}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DisableProgramGroupPage=yes
LicenseFile=..\..\LICENSE
OutputDir=..\innoSetup
OutputBaseFilename=setup_myapp_{#MyAppVersion}
SetupIconFile=..\..\src\main\resources\myapp32.ico
Compression=lzma
SolidCompression=yes

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "..\..\build\launch4j\myapp.exe"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon; Comment: "Myapp {#MyAppVersion}"; AppUserModelID: "nl.mynamespace.myapp.Main"
; create icon shortcut that embeds AppUserModelID information, which is the same as
; set in the program, to enable pinning to taskbar.


[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: shellexec postinstall skipifsilent

5. 在InnoSetup中,点击Build | Compile。如果您已经正确设置了所有路径,现在将会有一个安装文件,使用它您可以安装JavaFX应用程序并将其固定到任务栏。

生成的图标:

nice!


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