在JavaFX中设置舞台上的图标

11

我想知道如何在JavaFX舞台上设置图标。我找到了这个方法,但它没有正常工作。

  stage.getIcons().add(new Image(iconImagePath));

stage是javafx.stage.Stage的一个实例,我已经导入了javafx.scene.image.Image。 这是我们收到的异常:

无效的URL:无效的URL或未找到资源

此外,iconImagePath没有任何问题,它的值为“G:/test.jpg”,并且G驱动器中有一个名为test的jpg文件。此外,当我们使用ImageIO读取相同的URL时,我们可以轻松地完成它。


1
G:/test.jpg 不是一个 URL,如果你尝试使用 file:/G:/test.jpg 呢? - mavroprovato
1
相关链接:https://dev59.com/Amkw5IYBdhLWcg3wHm9-#10122335 - Michael Berry
12个回答

18
stage.getIcons().add(new Image(getClass().getResourceAsStream("bal.png")));

这个例子是有效的。我将图标放在与源.java文件相同的文件夹/包中。

目录结构


非常感谢您,使用这种方法不会引发任何异常,但是舞台的图像图标没有改变!! - Siavash
1
如果你使用 **getResourceAsStream("")**,则不需要加上 file: 。这只是一个协议。因此,如果你正在使用 getResourceAsStream,则要去掉 file:。 - subash
stage.getIcons().add(new Image(getClass().getResourceAsStream("bal.png"))); stage.getIcons().add(new Image(getClass().getResourceAsStream("bal2.png"))); - Siavash
请查看我的答案。上传我的目录结构。在哪里找到.java文件,那里就是你的图像文件所在地。 - subash
1
那么你想把它放在哪里? - subash
显示剩余9条评论

4
javafx.scene.image.Image的构造函数需要一个URI,而不是(完整的)路径。这个URI可以是相对的(例如/images/flower.png),也可以是绝对的(例如file:flower.png)。
G:/test.jpg这样的字符串不是有效的URL,因此是非法的。
请尝试使用file:g:/test.jpg
通常,图标应该与您的应用程序捆绑在一起,所以只需将图像文件放入您的类路径中(例如,如果您正在使用eclipse,请将其放入您的“src”目录中)并像这样使用它:
stage.getIcons().add(new Image("/logo.jpg"));

非常感谢,使用这种方法不会抛出任何异常,但是舞台的图像图标没有改变!! - Siavash
如果您没有收到任何异常,这意味着图像已被找到并加载。如果您按下Alt+Tab键,您应该能够在窗口的裁剪区域、Windows任务栏和任务列表中看到它。 - isnot2bad

2

最佳方式:

stage.getIcons().add(new Image(getClass().getResource(IconImagePath).toExternalForm()));

这有点简洁。请解释为什么这个解决方案是“最佳方式”,特别是已经发布了这么多其他答案的情况下。 - APC

2

使用

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

并将图像 logo.png 放在项目根目录中(与 src 目录相同的目录中)


非常感谢,使用这种方法不会抛出任何异常,但是舞台的图像图标没有改变!! - Siavash
尝试清理项目并重新构建,而不仅仅是运行。 - Maher Abuthraa
你能发布一下你的目录结构吗? - subash

1

这是可工作的代码,正是你需要的:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author Manikant gautam
 * This is a beginner's sample application
 * using JAVAFX
 * 
*/

public class Helloworld extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);
        // Set Icon From Here.
        primaryStage.getIcons().add(
            new Image("/resource/graphics/app_logo.png"));
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }


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

用语句设置图标:

primaryStage.getIcons().add(new Image("/resource/graphics/app_logo.png"));

我认为通过示例会更有帮助。而不是只放置一行代码。 - manikant gautam

1
不要忘记,你的图标必须是 32x3216x16 分辨率,否则它将无法工作。

1
// Set the icon
stage.getIcons().add(new Image(getClass().getResourceAsStream("penguin.png")));

我遇到了同样的问题。我使用的是Netbeans。我不确定其他IDE的文件夹结构是否不同,但我必须将图片放在/build/classes/(包含JavaFX类文件的包)中。这意味着它不会进入src文件夹。

1
如果您正在使用Eclipse,请确保将包含图像的文件夹添加到构建路径中。这样,您就可以轻松地通过名称引用图像,而不会出现任何问题。在此输入图片描述

0

我使用NetBeans 8.2,如果我使用:

stage.getIcons().addAll(new Image(getClass().getResourceAsStream("home-icon32.png")));

我必须将图像放在src目录中。不知道为什么,但只有这种方式才有效。我尝试将其放在build/classes中,但是失败了。


0

这是我所做的,它可以工作。图像位于我的资源文件夹的根目录中。

stage.getIcons().add(new Image("/ubuntu-mini.png"));

我正在使用 JavaFX 8


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