JavaFX应用程序图标


Answers:


241

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

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

根据下面的注释,如果将其包装在一个包含的jar中,则需要使用以下方法:

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

6
另外,如果要将图标作为应用程序快捷方式安装,并且您将WebStart用作部署技术,则可能需要在jnlp文件中设置适当的图标/快捷方式/桌面设置:docs.oracle.com/javase/7 / docs / technotes / guides / javaws /…
jewelsea

9
您可以添加多个不同大小的图像,JavaFX将选择最合适的图像。因为您在任务栏中有不同的大小,在标题栏中有不同的大小。
drzymala 2013年

12
我认为这仅在文件位于文件系统中时才起作用,对于更常见的情况,即图标包装在jar文件中和类路径中,这对我不起作用。使用stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));作品的其他解决方案之一。
k_o_

3
请不要,至少在Ubuntu(Unity)上,该图标仅用于装饰窗口,而不用于启动器。要使图标可见(而不是难看的问号),您需要指定适当的.dektop文件。在这里
dzim

1
这仅更改标题栏上的图标,即窗口的左上方。如何在桌面上将应用程序图标更改为快捷方式?在任务栏上?
TejpalBh

76

我尝试过,它完全可以工作。代码是:

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

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


4
“ <yourclassname> .class”可以替换为“ getClass()”
Jim Fred

71

面向初学者的完整程序:)此程序设置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"));

在此处输入图片说明

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


这是否支持svg?
2014年

1
@qed,我认为不支持SVG,但我不确定100%。你可以测试一下。
Madan Sapkota

我只是尝试将.svg文件用于JavaFX应用程序图标。它不起作用。没有提供错误,但是JavaFX使用了默认徽标而不是我的自定义徽标。
西蒙·迪默特


7

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

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

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

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


2

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

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

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


将资源放在Java包中不是一个好习惯。建议将它们放在您的resources文件夹中。
Thibstars

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

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


1
stage.getIcons().add(new Image(ClassLoader.getSystemResourceAsStream("images/icon.png")));

images文件夹必须位于Resource文件夹中。


4
这个答案是完全没有必要的,因为另一个答案已经对此进行了解释。
L. Guthardt

1

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

stage.getIcons()。add(new Image(“ image path”));



0

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

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

这里的窗口是舞台。


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>

这会将图标添加到快捷方式和任务栏。


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

-1

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


-2

在JavaFX的标题栏中插入自己的图标的另一种简便方法是使用以下方法将图像添加到主舞台:

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

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


41
这不就是究竟是什么已经公布以上?
XXL

-2

我试过了,它有效:

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

实际上,..否:资源查找中不支持点,请阅读api文档
kleopatra
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.