在 javafx 中定义 <Image/> 标签
Define <Image/> tag in javafx
我想要的是我的 GUI 组件(导出为 jar 文件,并由另一个组件使用)可以通过使用存储在其 jar 文件旁边的图像文件夹中的图像来动态更改图像。因此,在标记中使用 url 不是一个选择,因为无论我如何尝试,我的 jxml 文件都无法找到未包含在 jar 文件中的图像资源。
所以我这样尝试:
In my avatar.jxml file
<ImageView>
<image>
<Image fx:id="myImage"/>
</image>
</ImageView>
In my Java file
public Image myImage = new Image("location of an image stored on computer");
URL location = getClass().getResource("avatar.fxml");
ResourceBundle resources = ResourceBundle.getBundle("myResource");
FXMLLoader fxmlLoader = new FXMLLoader(location, resources);
Pane root = (Pane)fxmlLoader.load();
MyController controller = (MyController)fxmlLoader.getController();
但是当我尝试 运行 程序时,javaFX 抛出异常并要求图像标记中的 url 不应该为空。
有人可以告诉我我做错了什么吗?
非常感谢。
P/S 为了您的阅读方便,代码进行了简化。我正在使用 Java 8.
如错误所述,必须使用图像数据的 URL 初始化 Image
。
如果您希望能够动态更改显示的图像,您需要将 ImageView
(可以初始化 "empty",即没有图像)注入您的控制器,然后根据需要在其上设置图像。
所以在 FXML 中就这样做
<ImageView fx:id="myImageView" />
并在控制器中执行
public class MyController {
@FXML
private ImageView myImageView ;
public void initialize() { // or in an event handler, or when you externally set the image, etc
Path imageFile = Paths.get("/path/to/image/file");
myImageView.setImage(new Image(imageFile.toUri().toURL().toExternalForm()));
}
}
我想要的是我的 GUI 组件(导出为 jar 文件,并由另一个组件使用)可以通过使用存储在其 jar 文件旁边的图像文件夹中的图像来动态更改图像。因此,在标记中使用 url 不是一个选择,因为无论我如何尝试,我的 jxml 文件都无法找到未包含在 jar 文件中的图像资源。
所以我这样尝试:
In my avatar.jxml file
<ImageView>
<image>
<Image fx:id="myImage"/>
</image>
</ImageView>
In my Java file
public Image myImage = new Image("location of an image stored on computer");
URL location = getClass().getResource("avatar.fxml");
ResourceBundle resources = ResourceBundle.getBundle("myResource");
FXMLLoader fxmlLoader = new FXMLLoader(location, resources);
Pane root = (Pane)fxmlLoader.load();
MyController controller = (MyController)fxmlLoader.getController();
但是当我尝试 运行 程序时,javaFX 抛出异常并要求图像标记中的 url 不应该为空。
有人可以告诉我我做错了什么吗?
非常感谢。
P/S 为了您的阅读方便,代码进行了简化。我正在使用 Java 8.
如错误所述,必须使用图像数据的 URL 初始化 Image
。
如果您希望能够动态更改显示的图像,您需要将 ImageView
(可以初始化 "empty",即没有图像)注入您的控制器,然后根据需要在其上设置图像。
所以在 FXML 中就这样做
<ImageView fx:id="myImageView" />
并在控制器中执行
public class MyController {
@FXML
private ImageView myImageView ;
public void initialize() { // or in an event handler, or when you externally set the image, etc
Path imageFile = Paths.get("/path/to/image/file");
myImageView.setImage(new Image(imageFile.toUri().toURL().toExternalForm()));
}
}