在 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】:别忘了你的图标必须是32x32
或16x16
的分辨率,否则就不行了。
【讨论】:
【参考方案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 中为 TextField 设置 KeyPressed 事件