在JavaFX控制器类中使用ImageView

时间:2017-01-02 19:56:28

标签: javafx

我在NetBeans中创建了一个javaFX fxml应用程序,并希望使用在handleButtonAction事件中打开的filechooser来显示图像。

如果我使用gui构建器将ImageView拖到面板中,我看不到它在代码中生成它的对象。

如果我手动将Imageview添加到主类,我没有可用的按钮处理程序方法,如果我将它添加到控制器类,我没有可用于将Imageview附加到的主面板。我想我不理解如何将ui构建器中的元素生成为代码。

生成的NetBeans项目以一个hello按钮开始,该按钮在源文件中也没有可见对象,所以我很想知道ui构建器如何设置正确的xml数据以使这些元素可用于控制器,但似乎我没有任何方式从ui构建器添加到控制器。只是UI构建器不可靠​​吗?

任何帮助都将不胜感激。

主要的应用程序类如下:

package javafxapplication2;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class JavaFXApplication2 extends Application {


    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

和控制器:

package javafxapplication2;


import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
//import javafx.scene.image.Image;
//import javafx.scene.image.ImageView;
//import javafx.stage.FileChooser;
//import javax.imageio.ImageIO;
//import java.io.File;
//import java.io.IOException;

public class FXMLDocumentController implements Initializable {

 //   private ImageView imgview = new ImageView();
 //   private FileChooser filechooser = new FileChooser();


    @FXML
    private void handleButtonAction(ActionEvent event) {
     //commented out because it displays nothing

//        try {
//            File infile = filechooser.showOpenDialog(null);
//            Image img = SwingFXUtils.toFXImage(ImageIO.read(infile), null);
//            imgview.setImage(img);
//        } catch (IOException ex) {
//            Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
//        }
        System.out.println("button clicked");

    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    

}

和XML:

<?import javafx.scene.image.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="355.0" prefWidth="411.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication2.FXMLDocumentController">
    <children>
        <Button fx:id="button" layoutX="14.0" layoutY="312.0" onAction="#handleButtonAction" text="open file" />
      <ImageView fitHeight="150.0" fitWidth="200.0" layoutX="84.0" layoutY="73.0" pickOnBounds="true" preserveRatio="true" />
      <Button layoutX="212.0" layoutY="310.0" mnemonicParsing="false" text="Button" />
    </children>
</AnchorPane>

1 个答案:

答案 0 :(得分:1)

您没有使用在控制器内部的FXML中创建的ImageView。

您应该为ImageView分配fx:id,然后将其注入控制器。这样,在ImageView中设置Image时将使用相同的ImageView。

在FXML中:

<ImageView fx:id="imgview" fitHeight="150.0" fitWidth="200.0" 
                  layoutX="84.0" layoutY="73.0" pickOnBounds="true" preserveRatio="true" />

在控制器中:

 public class FXMLDocumentController implements Initializable {

      @FXML
      private ImageView imgview;
      ...
 }

MCVE

<强> FXML

<?import javafx.scene.control.Button?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane" prefHeight="355.0" prefWidth="411.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="FXMLDocumentController">
    <children>
        <Button fx:id="button" layoutX="14.0" layoutY="312.0" onAction="#handleButtonAction" text="open file" />
        <ImageView fx:id="imageView" fitHeight="150.0" fitWidth="200.0" layoutX="84.0" layoutY="73.0" pickOnBounds="true" preserveRatio="true" />
        <Button layoutX="212.0" layoutY="310.0" mnemonicParsing="false" text="Button" />
    </children>
</AnchorPane>

<强>控制器

import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.FileChooser;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

public class FXMLDocumentController implements Initializable {

    @FXML
    private ImageView imageView;
    private FileChooser filechooser = new FileChooser();


    @FXML
    private void handleButtonAction(ActionEvent event) {
        try {
            File infile = filechooser.showOpenDialog(null);
            Image img = SwingFXUtils.toFXImage(ImageIO.read(infile), null);
            imageView.setImage(img);
        } catch (IOException ex) {
            Logger.getLogger(TestController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }
}

主要

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}