首页 文章

JavaFX ImageView(FXML)不显示/更改图片

提问于
浏览
0

我正在使用SceneBuilder设计一个界面,并使用代码here设置一个简单的FileChooser来打开和查看图片文件 .

隔离的代码经过测试并且工作正常,我试图将它集成到我现有的界面中,它只是一直失败 . 没有错误信息,没有 . 我已经开始在命令和所有内容"works"周围放置 println .

这是我的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)

1 回答

  • 2

    Never 初始化带注释的字段 @FXML . 您正在更改在 initialize() 方法中创建的 ImageView 的图像,而不是在FXML文件中创建的图像 . 显然,在FXML文件中创建的那个是实际显示在UI中的那个,并且在 initialize() 方法中创建的那个永远不会显示(你永远不会把它放在任何地方的场景图中);因此您要更改未显示的图像视图的图像 .

    更改

    iv_main = new ImageView(image);
    

    iv_main.setImage(image);
    

相关问题