JavaFX ImageView (FXML) 没有 show/change 图片
JavaFX ImageView (FXML) dosen't show/change the pictures
我正在使用 SceneBuilder 设计界面并使用代码 here 设置一个简单的 FileChooser 来打开和查看图片文件。
隔离的代码已经过测试并且工作正常,我试图将它集成到我现有的界面中,但它总是失败。没有错误信息,什么都没有。
我已经开始将 println
放在命令和所有内容周围 "works"。
这是我的 GUI,到目前为止设计有效(我刚开始使用 VBox
而不是常规 Panel
,因为我所有的尝试都失败了)
<HBox prefHeight="790.0" prefWidth="927.0" style="-fx-background-color: green;">
<children>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<ImageView fx:id="iv_main" fitHeight="473.0" fitWidth="462.0" pickOnBounds="true" preserveRatio="true" />
</children>
</VBox>
<VBox prefHeight="790.0" prefWidth="236.0">
<!-- And things inside -->
</VBox>
</children>
</HBox>
控制器中的代码 - 初始化程序在此处不显示该版本中的任何图片。然而,如果我在原始文件中做同样的事情,它就会起作用:
@FXML
private ImageView iv_main;
//I know this here looks nasty but I tried the path 1:1 in the
//isolated version (even a different project) - but works 100%
private String RESJPG = "/home/qohelet/NetBeansProjects/KV/src/main/resources/fxml/ahok.jpg";
@Override
public void initialize(URL url, ResourceBundle rb) {
/*
* In the original file here are two ObservableLists
* filled successfully. So I can assume the initialize-method works
*/
btn_openFolder.setOnAction(btnLoadEventListener);
try {
FileInputStream input = new FileInputStream(RESJPG);
Image image = new Image(input);
iv_main = new ImageView(image);
} catch (FileNotFoundException|NullPointerException | java.lang.IllegalArgumentException nupo) {
System.err.println(RESJPG + " not found");
}
}
事件处理程序在那个动作事件上工作得很好——但它对 ImageView 没有任何作用:
EventHandler<ActionEvent> btnLoadEventListener
= new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
System.out.println("Click");
FileChooser fileChooser = new FileChooser();
//Set extension filter
FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("Bilddateien", "*.JPG", "*.jpg", "*.jpeg", "*.JPEG", "*.PNG", "*.png");
fileChooser.getExtensionFilters().addAll(extFilterJPG);
//Show open file dialog
File file = fileChooser.showOpenDialog(null);
System.out.println("File: " + file.getAbsolutePath());
try {
BufferedImage bufferedImage = ImageIO.read(file);
Image image = SwingFXUtils.toFXImage(bufferedImage, null);
iv_main.setImage(image);
iv_main.setVisible(true); //In Swing you sometimes had to do that command - but here regardless if inserted or not, no changes
} catch (IOException ex) {
Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
我现在 运行 没主意了...文件已正确显示在控制台中,我保持清洁并构建项目,移动 ImageView 所以它不可能被另一个覆盖对象,但结果没有变化...
我什至尝试了这两种方法来更改图像(先开始,然后使用 FileChooser
)- 但什么也没有。
我做错了什么?
(与版本(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion()
)有关,我使用的是:8.0.131-b11)
从不 初始化带注释的字段 @FXML
。您正在更改在 initialize()
方法中创建的 ImageView
的图像,而不是在 FXML 文件中创建的图像。很明显,在FXML文件中创建的是UI中实际显示的那个,而你在initialize()
方法中创建的是永远不会显示的(你永远不会把它放在场景图中的任何地方);所以您正在更改未显示的图像视图的图像。
改变
iv_main = new ImageView(image);
至
iv_main.setImage(image);
我正在使用 SceneBuilder 设计界面并使用代码 here 设置一个简单的 FileChooser 来打开和查看图片文件。
隔离的代码已经过测试并且工作正常,我试图将它集成到我现有的界面中,但它总是失败。没有错误信息,什么都没有。
我已经开始将 println
放在命令和所有内容周围 "works"。
这是我的 GUI,到目前为止设计有效(我刚开始使用 VBox
而不是常规 Panel
,因为我所有的尝试都失败了)
<HBox prefHeight="790.0" prefWidth="927.0" style="-fx-background-color: green;">
<children>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<ImageView fx:id="iv_main" fitHeight="473.0" fitWidth="462.0" pickOnBounds="true" preserveRatio="true" />
</children>
</VBox>
<VBox prefHeight="790.0" prefWidth="236.0">
<!-- And things inside -->
</VBox>
</children>
</HBox>
控制器中的代码 - 初始化程序在此处不显示该版本中的任何图片。然而,如果我在原始文件中做同样的事情,它就会起作用:
@FXML
private ImageView iv_main;
//I know this here looks nasty but I tried the path 1:1 in the
//isolated version (even a different project) - but works 100%
private String RESJPG = "/home/qohelet/NetBeansProjects/KV/src/main/resources/fxml/ahok.jpg";
@Override
public void initialize(URL url, ResourceBundle rb) {
/*
* In the original file here are two ObservableLists
* filled successfully. So I can assume the initialize-method works
*/
btn_openFolder.setOnAction(btnLoadEventListener);
try {
FileInputStream input = new FileInputStream(RESJPG);
Image image = new Image(input);
iv_main = new ImageView(image);
} catch (FileNotFoundException|NullPointerException | java.lang.IllegalArgumentException nupo) {
System.err.println(RESJPG + " not found");
}
}
事件处理程序在那个动作事件上工作得很好——但它对 ImageView 没有任何作用:
EventHandler<ActionEvent> btnLoadEventListener
= new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
System.out.println("Click");
FileChooser fileChooser = new FileChooser();
//Set extension filter
FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("Bilddateien", "*.JPG", "*.jpg", "*.jpeg", "*.JPEG", "*.PNG", "*.png");
fileChooser.getExtensionFilters().addAll(extFilterJPG);
//Show open file dialog
File file = fileChooser.showOpenDialog(null);
System.out.println("File: " + file.getAbsolutePath());
try {
BufferedImage bufferedImage = ImageIO.read(file);
Image image = SwingFXUtils.toFXImage(bufferedImage, null);
iv_main.setImage(image);
iv_main.setVisible(true); //In Swing you sometimes had to do that command - but here regardless if inserted or not, no changes
} catch (IOException ex) {
Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
我现在 运行 没主意了...文件已正确显示在控制台中,我保持清洁并构建项目,移动 ImageView 所以它不可能被另一个覆盖对象,但结果没有变化...
我什至尝试了这两种方法来更改图像(先开始,然后使用 FileChooser
)- 但什么也没有。
我做错了什么?
(与版本(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion()
)有关,我使用的是:8.0.131-b11)
从不 初始化带注释的字段 @FXML
。您正在更改在 initialize()
方法中创建的 ImageView
的图像,而不是在 FXML 文件中创建的图像。很明显,在FXML文件中创建的是UI中实际显示的那个,而你在initialize()
方法中创建的是永远不会显示的(你永远不会把它放在场景图中的任何地方);所以您正在更改未显示的图像视图的图像。
改变
iv_main = new ImageView(image);
至
iv_main.setImage(image);