【问题标题】:JavaFX Application IconJavaFX 应用程序图标
【发布时间】:2012-04-24 16:56:02
【问题描述】:

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

【问题讨论】:

    标签: java javafx javafx-2 javafx-8 stage


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 此外,如果要将图标安装为应用程序快捷方式,并且您使用 WebStart 作为部署技术,那么您可能需要在 jnlp 文件中设置适当的图标/快捷方式/桌面设置:@ 987654321@
    • 您可以添加多张不同尺寸的图片,JavaFX 会选择最适合的一张。因为你的任务栏大小不同,标题栏大小不同。
    • 我认为这仅在文件位于文件系统中时才有效,对于更常见的情况是图标包含在 jar 文件和类路径中,这对我不起作用。使用stage.getIcons().add( new Image( &lt;yourclassname&gt;.class.getResourceAsStream( "icon.png" ))); 的其他解决方案之一有效。
    • 请注意,至少在 Ubuntu (Unity) 上,该图标仅用于窗口装饰,而不用于启动器。要使图标可见(而不是丑陋的问号),您需要指定适当的 .dektop 文件。查看我的描述 here
    • 这只会改变标题栏上的图标,即窗口的左上角。如何在桌面上作为快捷方式更改应用程序的图标?在任务栏上?
    【解决方案2】:

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

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

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

    【讨论】:

    • '.class' 可以替换为 'getClass()'
    • 如果你想把你的图标放在资源目录中,你需要将 .class.getResourceAsStream( "icon.png" )) 更改为 .class.getClassLoader() .getResourceAsStream("icon.png))
    【解决方案3】:

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

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

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

    【讨论】:

    • 这不是正是上面发布的内容吗?
    【解决方案4】:

    初学者的完整程序:) 该程序为 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 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"));
    

    希望对您有所帮助。谢谢!!

    【讨论】:

    • 这个支持svg吗?
    • @qed,我认为不支持 SVG,但我不是 100% 确定。你可以测试一下。
    • 我刚刚尝试使用 .svg 文件作为 JavaFX 应用程序图标。它不起作用。没有提供错误,但 JavaFX 使用了它的默认徽标而不是我的自定义徽标。
    【解决方案5】:
    stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png")));
    

    如果您的 icon.png 位于资源目​​录中,请记住在前面加上“/”,否则它将不起作用

    【讨论】:

      【解决方案6】:

      我试过了,效果很好:

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

      【讨论】:

      • 其实.. no: 资源查询不支持点,请阅读api文档
      【解决方案7】:
      stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));
      

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

      【讨论】:

        【解决方案8】:

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

        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")));
        

        【讨论】:

          【解决方案9】:

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

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

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

          【讨论】:

          • 将资源放置在您的 java 包中并不是一个好习惯。建议将它们放在您的resources 文件夹中。
          【解决方案10】:

          您可以在 fxml.xml 中添加它。舞台级别

          <icons>
              <Image url="@../../../my_icon.png"/>
          </icons>
          

          【讨论】:

            【解决方案11】:
            stage.getIcons().add(new Image("/images/logo_only.png"));
            

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

            【讨论】:

            • 这个答案完全没有必要,因为another answer 已经解释过了。
            【解决方案12】:
            stage.getIcons().add(new Image(ClassLoader.getSystemResourceAsStream("images/icon.png")));
            

            images 文件夹需要在 Resource 文件夹中。

            【讨论】:

            • 这个答案完全没有必要,因为another answer 已经解释过了。
            【解决方案13】:

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

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

            这里的窗口就是舞台。

            【讨论】:

              【解决方案14】:

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

              【讨论】:

                【解决方案15】:

                您可以使用此代码行轻松地将图标添加到您的应用程序中

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

                【讨论】:

                  【解决方案16】:

                  如果您运行 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>
                  

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

                  【讨论】:

                    【解决方案17】:

                    在运行时切换图标:

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

                    要在运行时设置新图标,请在尝试添加新图标之前使用 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")));
                        }
                    }
                    

                    【讨论】:

                      猜你喜欢
                      • 2018-02-10
                      • 2014-08-10
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-05-24
                      • 2018-01-03
                      • 2016-11-05
                      相关资源
                      最近更新 更多