任务栏中的 JavaFX 图标质量

标签 java javafx kotlin

在JavaFX中设置png图片作为舞台图标时(使用Kotlin,但这在Java中也是一个问题),图标似乎变形了。

我用 google 搜索了这个问题,发现了以下内容:

  • 它曾经是(现在可能仍然是)一个错误。关于issue page对于这个错误,他们解释说解决方法是避免使用半透明像素。我试过了,但我的图像仍然变形,如下所示。

32x32 Deformed 32x32

提供给 JavaFx 的原始 32x32 图像。 正确。JavaFx 放入任务栏的图像。

Original 48x48 Deformed 48x48

提供给 JavaFx 的原始 48x48 图片。 正确。JavaFx 放入任务栏的图像。

看起来 32x32 的必须按比例放大,而 48x48 的必须按比例缩小,大约为 42x42(我也制作了 42x42,但这也无济于事)。 由于 Windows“想要”的大小是 2 的幂或 48x48,因此您会说这些大小都可以。

  • 我遇到了 this关于这个话题的老问题。这里讨论的是,JavaFX 不会自动选择图标的最佳尺寸,但通常是您添加到图标集中的最后一个图标,因此建议将您认为最合适的图标放在最后。<

据我所知,这(可能)是 JavaFX 中一个 Unresolved 错误,而另一个问题最后一次出现是在大约三年前,我想知道是否有人在此期间找到了更好的解决方法。

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

  • icon48.png: Original 48x48 icon
  • icon32.png: Original 32x32 icon

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)
}

最佳答案

您的程序的 Windows 发布版本(最重要的是,这对调试版本没有帮助)的解决方案是使用 launch4j 和 InnoSetup。 launch4j 生成一个可执行文件,InnoSetup 围绕它包装一个安装过程。

如何为 Windows 的 JavaFX 应用程序添加好看的图标 (并使其固定到任务栏)

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"
}

并将图标和manifest文件放到你指定的路径下,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 中,单击构建 |编译。如果所有路径都正确,您现在将拥有一个安装文件,如果使用它,您将安装可以固定到任务栏的 JavaFX 应用程序。

结果图标:

nice!

关于任务栏中的 JavaFX 图标质量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49739308/

相关文章:

java - 无法调用不同模块中的类(动态功能模块)

android - 如何解决 : "error: cannot find symbol class ..." after converting Java class to Kotlin?

java - 实现DoublyLinkedList时出现StackOverflow错误

java - GWT 对象序列化

java - Hibernate ID 生成器困惑

Java Web Start 无法加载 db2jcc.jar

javafx - 如何确定JavaFX应用程序所需的FXML文件,CSS文件,图像和其他资源的正确路径?

JavaFx 电子表格单元格右键单击打开对话框

java - 相反的方法不执行任何堆栈操作

java - 在 JavaFX 中向 GridPane 添加标签时遇到问题