193

是否可以使用 JavaFX 更改应用程序图标,还是必须使用 Swing 来完成?

4

17 回答 17

274

假设您的阶段是“阶段”并且文件在文件系统上:

stage.getIcons().add(new Image("file:icon.png"));

根据下面的评论,如果它被包装在一个包含 jar 中,则需要使用以下方法:

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("icon.png")));
于 2012-04-12T11:08:40.320 回答
82

我试过这个,它完全有效。代码是:

stage.getIcons().add(
   new Image(
      <yourclassname>.class.getResourceAsStream( "icon.png" ))); 

icon.png 与源文件位于同一文件夹下。

于 2012-10-10T21:10:40.823 回答
77

初学者的完整程序 :) 该程序为 StackOverflowIcon 设置图标。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class StackoverflowIcon extends Application {

    @Override
    public void start(Stage stage) {
        StackPane root = new StackPane();
        // set icon
        stage.getIcons().add(new Image("/path/to/stackoverflow.jpg"));
        stage.setTitle("Wow!! Stackoverflow Icon");
        stage.setScene(new Scene(root, 300, 250));
        stage.show();
    }

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

输出截图

JavaFX 截图

为 JavaFX 8 更新

无需更改代码。它仍然可以正常工作。在 Java 1.8(1.8.0_45) 中测试和验证。路径可以设置为本地或远程两者都支持。

stage.getIcons().add(new Image("/path/to/javaicon.png"));

或者

stage.getIcons().add(new Image("https://example.com/javaicon.png"));

在此处输入图像描述

希望能帮助到你。谢谢!!

于 2013-03-04T16:30:50.833 回答
10

您可以将其添加到 fxml 中。舞台级别

<icons>
    <Image url="@../../../my_icon.png"/>
</icons>
于 2017-04-05T08:30:33.690 回答
9

如果您有一个图像文件夹并且图标保存在该文件夹中,请使用此

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/images/comparison.png")));

如果您直接从您的包中使用它,这不是一个好习惯,请使用这个

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("comparison.png")));

如果你有一个文件夹结构并且你有你的图标在里面使用

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("../images/comparison.png")));
于 2016-10-25T12:26:19.573 回答
2

您如何看待在您的 src 目录中创建新包,即 image.icons 并将您的 .png 图像移到那里?比你只需要写:

Image image = new Image("/image/icons/nameOfImage.png");
primaryStage.getIcons().add(image);

这个解决方案非常适合我,但我仍然不确定它是否正确(这里是初学者)。

于 2017-03-22T13:51:50.307 回答
2
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png")));

If your icon.png is in resources dir and remember to put a '/' before otherwise it will not work

于 2016-05-25T11:18:52.130 回答
2
stage.getIcons().add(new Image(ClassLoader.getSystemResourceAsStream("images/icon.png")));

图像文件夹需要在资源文件夹中。

于 2017-11-28T12:19:17.863 回答
1
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));

您可以使用此方法添加多个不同尺寸的图标。图像应该是同一图像的不同尺寸,并且将选择最佳尺寸。 eg. 16x16, 32,32

于 2016-09-30T15:33:27.873 回答
1

您可以使用此代码行轻松地将图标放入您的应用程序

stage.getIcons().add(new Image("图像路径") );

于 2018-12-03T11:21:09.980 回答
0

如果您运行 jar 文件,Michael Berry 指定的代码将更改标题栏和任务栏中的图标。快捷方式图标无法更改。

如果您运行使用 com.zenjava 编译的本机程序,您必须添加程序图标的链接:

<plugin>
    <groupId>com.zenjava</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>8.8.3</version>
    <configuration>
    ...
        <bundleArguments>
            <icon>${project.basedir}/src/main/resources/images/filename.ico</icon>
        </bundleArguments>
    </configuration>
</plugin>

这将在快捷方式和任务栏上添加一个图标。

于 2019-03-04T14:11:03.043 回答
0
stage.getIcons().add(new Image("/images/logo_only.png"));

在 src 文件夹中创建 images 文件夹并从中获取图像是一个好习惯。

于 2017-07-17T13:24:54.753 回答
0

我在我的应用程序中使用了这个

Image icon = new Image(getClass().getResourceAsStream("icon.png"));
window.getIcons().add(icon);

这里的窗口就是舞台。

于 2017-12-11T04:31:54.600 回答
0

在运行时切换图标:

除了这里的回复,我发现一旦你第一次为你的应用程序分配了一个图标,你不能通过在你的舞台上添加一个新图标来切换它(如果你需要切换你的图标,这将很有帮助应用程序从开/关启用/禁用)。

要在运行时设置新图标,请在尝试添加新图标之前使用 getIcons().remove(0),其中 0 是您要覆盖的图标的索引,如下所示:

//Setting icon by first time (You can do this on your start method).
stage.getIcons().add(new Image(getClass().getResourceAsStream("enabled.png")));

//Overriding app icon with a new status (This can be in another method)
stage.getIcons().remove(0);
stage.getIcons().add(new Image(getClass().getResourceAsStream("disabled.png")));

要从其他方法或类访问阶段,您可以在主类中为阶段创建一个新的静态字段,以便可以通过封装在您可以从应用程序中的任何位置访问的静态方法从 start() 方法之外访问它.

public class MainApp extends Application {
    private static Stage stage;
    public static Stage getStage() { return stage; }

    @Override public void start(Stage primaryStage) {
        stage = primaryStage
        stage.getIcons().add(new Image(getClass().getResourceAsStream("enabled.png")));
    }
}

public class AnotherClass {
    public void setStageTitle(String newTitle) {
        MainApp.getStage().setTitle(newTitle);
        MainApp.getStage().getIcons().remove(0);
        MainApp.getStage().getIcons().add(new Image(getClass().getResourceAsStream("disabled.png")));
    }
}
于 2019-08-27T20:03:04.903 回答
-1

如果您Invalid URL or resource not found将 icon.png 放在工作区的“bin”文件夹中。

于 2018-11-28T19:11:19.307 回答
-2

在 JavaFX 的标题栏上插入自己的图标的另一种简单方法是使用以下方法将图像添加到主阶段:

Image ico = new Image("resources/images/iconLogo.png");
stage.getIcons().add(ico);

确保您的导入 javafx.scene.image.Image (如果使用像 netbeans 这样的 ide,这应该会自动为您完成)。

于 2012-10-16T09:25:59.393 回答
-2

我试过这个并且它有效:

stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));
于 2016-08-17T20:30:05.190 回答