Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaFX ImageView via FXML does not work

I have a problem with loading Images with ImageView on FXML.

My controller class:

public class BoxViewController {
    @FXML
    private Label label_boxID;

    @FXML
    private ImageView boximage;

    public void initData(ObservableList<BoxProperty> observableList,
                         BoxService sBox, 
                         TableView tableview) {
        this.label_boxID.setText(
            String.valueOf(this.boxproperty.getPboxid()));

        Image image = new Image("boximage.jpg");
        this.boximage = new ImageView();
        this.boximage.setImage(image);
    }
}

So, setting the label with a text works, but the image won't appear in my ImageView. For the ImageView, I added an ID to the FXML file:

 <ImageView fx:id="boximage" 
            disable="false" 
            fitHeight="150.0" fitWidth="200.0"
            layoutX="69.0" layoutY="322.0" 
            pickOnBounds="true" 
            preserveRatio="true" />

I'm confused why this is not working because the label works, but the image won't load.
I also checked whether boximage isn't null, but it isn't. There are also no Exceptions.

like image 212
mathew11 Avatar asked Mar 25 '14 12:03

mathew11


People also ask

Is FXML part of JavaFX?

FXML is an XML-based user interface markup language created by Oracle Corporation for defining the user interface of a JavaFX application. FXML presents an alternative to designing user interfaces using procedural code, and allows for abstracting program design from program logic.

How do I specify a controller in FXML?

It is also possible to assign the controller class directly from the FXML file. In order to do that, you should first open your FXML file and add the following code on the first line of the file right after declarations. Example: Since my controller is inside the package name “view”, my fx: controller = “view.

How can we load an image in JavaFX?

Create a FileInputStream representing the image you want to load. Instantiate the Image class bypassing the input stream object created above, as a parameter to its constructor. Instantiate the ImageView class. Set the image to it by passing above the image object as a parameter to the setImage() method.


2 Answers

Maybe it's a source image location issue. According to the comments at this website, from "Maxim", if you use new Image("boximage.jpg");, the root directory is the main project folder and e.g for scene.getStylesheets().add("login.css"); the root folder is src. Maybe you could try this:

Image img = new Image("file:boximage.jpg");
ImageView imageView = new ImageView(img);

Try to move the source image to the main project folder for this code

Just for testing purpose, try to load that image from FXML:

<ImageView id="boxImage" ...>    
   <image>
      <Image url="@boximage.jpg" />
   </image>
</ImageView>
like image 53
user2151486 Avatar answered Sep 18 '22 08:09

user2151486


This works:

BufferedImage bufferedImage;
bufferedImage = ImageIO.read(new File(this.path));
Image image = SwingFXUtils.toFXImage(bufferedImage, null);
this.boximage.setImage(image);
like image 29
mathew11 Avatar answered Sep 17 '22 08:09

mathew11