【发布时间】:2012-04-24 16:56:02
【问题描述】:
是否可以使用 JavaFX 更改应用程序图标,还是必须使用 Swing 来完成?
【问题讨论】:
标签: java javafx javafx-2 javafx-8 stage
是否可以使用 JavaFX 更改应用程序图标,还是必须使用 Swing 来完成?
【问题讨论】:
标签: java javafx javafx-2 javafx-8 stage
假设您的舞台是“舞台”并且文件在文件系统上:
stage.getIcons().add(new Image("file:icon.png"));
根据下面的评论,如果它被包装在一个包含 jar 中,则需要使用以下方法:
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("icon.png")));
【讨论】:
stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" ))); 的其他解决方案之一有效。
.dektop 文件。查看我的描述 here
我试过了,它完全有效。代码是:
stage.getIcons().add(
new Image(
<yourclassname>.class.getResourceAsStream( "icon.png" )));
icon.png 与源文件位于同一文件夹下。
【讨论】:
在 JavaFX 的标题栏上插入自己的图标的另一种简单方法是使用以下方法将图像添加到主阶段:
Image ico = new Image("resources/images/iconLogo.png");
stage.getIcons().add(ico);
确保您的导入 javafx.scene.image.Image(如果使用像 netbeans 这样的 ide,这应该会自动为您完成)。
【讨论】:
初学者的完整程序:) 该程序为 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"));
希望对您有所帮助。谢谢!!
【讨论】:
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png")));
如果您的 icon.png 位于资源目录中,请记住在前面加上“/”,否则它将不起作用
【讨论】:
我试过了,效果很好:
stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));
【讨论】:
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));
您可以使用此方法添加多个不同尺寸的图标。图像应该是同一图像的不同尺寸,并且会选择最佳尺寸。
eg. 16x16, 32,32
【讨论】:
如果您有一个图像文件夹并且图标保存在该文件夹中,请使用此文件夹
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")));
【讨论】:
您如何看待在您的 src 目录中创建新包,即 image.icons 并将您的 .png 图像移到那里?比你只需要写:
Image image = new Image("/image/icons/nameOfImage.png");
primaryStage.getIcons().add(image);
这个解决方案非常适合我,但我仍然不确定它是否正确(这里是初学者)。
【讨论】:
resources 文件夹中。
您可以在 fxml.xml 中添加它。舞台级别
<icons>
<Image url="@../../../my_icon.png"/>
</icons>
【讨论】:
stage.getIcons().add(new Image("/images/logo_only.png"));
在你的 src 文件夹中创建 images 文件夹并从中获取图像是一个好习惯。
【讨论】:
stage.getIcons().add(new Image(ClassLoader.getSystemResourceAsStream("images/icon.png")));
images 文件夹需要在 Resource 文件夹中。
【讨论】:
我在我的应用程序中使用了这个
Image icon = new Image(getClass().getResourceAsStream("icon.png"));
window.getIcons().add(icon);
这里的窗口就是舞台。
【讨论】:
如果您有Invalid URL or resource not found,请将您的 icon.png 放入工作区的“bin”文件夹中。
【讨论】:
您可以使用此代码行轻松地将图标添加到您的应用程序中
stage.getIcons().add(new Image("图片路径"));
【讨论】:
如果您运行 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>
这会在快捷方式和任务栏上添加一个图标。
【讨论】:
在运行时切换图标:
除了这里的回复,我发现一旦你第一次为你的应用程序分配了一个图标,你就不能通过向你的舞台添加一个新图标来切换它(如果你需要切换您的应用程序的图标从启用/禁用启用/禁用)。
要在运行时设置新图标,请在尝试添加新图标之前使用 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")));
}
}
【讨论】: