在 JavaFX 的舞台上设置图标

Posted

技术标签:

【中文标题】在 JavaFX 的舞台上设置图标【英文标题】:Set Icon on Stage in JavaFX 【发布时间】:2013-12-04 08:49:30 【问题描述】:

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

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

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

无效网址:无效网址或找不到资源

另外,iconImagePath 没有问题,它的值是“G:/test.jpg” 而且G盘里面有个jpg文件叫test。此外,当我们使用 ImageIO 读取相同的 URL 时,我们可以轻松做到。

【问题讨论】:

G:/test.jpg 不是 URL,如果您尝试使用 file:/G:/test.jpg 会怎样? 相关:***.com/questions/10121991/javafx-2-application-icon/… 【参考方案1】:

使用

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

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

【讨论】:

非常感谢,使用这种方法不会抛出异常,但是stage的图像图标没有改变!! 尝试清理项目并再次构建它,不仅运行。 你能发布你的目录结构吗..?【参考方案2】:

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

【讨论】:

非常感谢,使用这种方法不会抛出异常,但是stage的图像图标没有改变!! 如果没有异常,说明可以找到并加载图片。如果您按 Alt+Tab,您应该会在窗口的修剪区域、窗口任务栏和任务列表中看到它。【参考方案3】:
stage.getIcons().add(new Image(getClass().getResourceAsStream("bal.png")));

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

目录结构

【讨论】:

非常感谢,使用这种方法不会抛出异常,但是stage的图像图标没有改变!! 再次感谢您,但它不适用于此路径:file:images/pic.jpeg 如果你使用 getResourceAsStream("") 不需要 file: 。它只是一个协议。所以删除文件:如果您使用的是 getResourceAsStream 照你说的做了,但我收到了这个异常:线程“JavaFX Application Thread”中的异常java.lang.NullPointerException:输入流不能为空 那你想放哪里??【参考方案4】:

这就是我所做的并且它有效。该图像位于我的资源文件夹的根目录中。

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

我正在使用 JavaFX 8

【讨论】:

【参考方案5】:

解决办法是:

File f = new File("image.png");
Image ix = new Image(f.toURI().toString());
stage.getIcons().add(ix);

【讨论】:

【参考方案6】:

别忘了你的图标必须是32x3216x16的分辨率,否则就不行了。

【讨论】:

【参考方案7】:

最佳方式:

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

【讨论】:

这有点简洁。请解释为什么这个解决方案是“最好的方法”,特别是当已经发布了这么多其他答案时。【参考方案8】:

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

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

【讨论】:

我认为通过示例的帮助会有所帮助。而不是放置单行代码。【参考方案9】:
// Set the icon
stage.getIcons().add(new Image(getClass().getResourceAsStream("penguin.png")));

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

【讨论】:

【参考方案10】:
public class Main extends Application

    private static final Logger LOGGER = Logger.getLogger(Main.class);

    @Override
    public void start(Stage primaryStage)
        
            try
                
                    // BorderPane root = new BorderPane();
                    BorderPane root = (BorderPane) FXMLLoader
                            .load(getClass().getResource("/org/geeksynergy/view/layout/FrontPageBorder.fxml"));
                    root.setAccessibleText("good");

                    Scene scene = new Scene(root, 400, 400);
                    scene.getStylesheets().add(getClass()
                            .getResource("/org/geeksynergy/view/cssstyle/application.css").toExternalForm());
                    primaryStage.setScene(scene);
                    primaryStage.setTitle("AiRJuke");
                    primaryStage.getIcons().add(new Image("/org/geeksymergy/resource/images/download.png"));
                    primaryStage.show();
                    AnchorPane personOverview = (AnchorPane) FXMLLoader
                            .load(getClass().getResource("/org/geeksynergy/view/layout/Ui.fxml"));

                    root.setCenter(personOverview);

                    // added this line to save the playlist , when we close
                    // application window
                    Platform.setImplicitExit(false);

                    primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>()
                        
                            public void handle(WindowEvent event)
                                
                                    M3UPlayList.defaultSavePlaylist();
                                    Platform.setImplicitExit(true);
                                    primaryStage.hide();
                                
                        );

                 catch (Exception e)
                

                    LOGGER.error("Exception while loding application", e);
                
        

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

【讨论】:

【参考方案11】:

我使用 netbeans 8.2,如果我使用: stage.getIcons().addAll(new Image(getClass().getResourceAsStream("home-icon32.png")));

我必须将图像放在 src 目录中。不知道为什么,但只能这样工作。我已经尝试将它放在构建/类中,但是否定的。

【讨论】:

【参考方案12】:

如果您使用的是 eclipse,请确保将包含图像的文件夹添加到构建路径中。这样您就可以毫无问题地引用带有名称的图像。

【讨论】:

以上是关于在 JavaFX 的舞台上设置图标的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX Ubuntu 舞台停靠图标不更新

自定义primaryStage标题:以图标为中心

在 JavaFX 中为 TextField 设置 KeyPressed 事件

在JavaFX中为TextField设置KeyPressed事件

使用 JavaFX 设置应用程序图标时遇到问题

JavaFX/Mac:当我将 useSystemMenuBar 设置为 true 时,系统菜单变得无响应