package de.eisfeldj.augendiagnosefx.fxelements; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.HPos; import javafx.geometry.VPos; import javafx.scene.image.ImageView; import javafx.scene.layout.Region; /** * A custom pane holding an image view, so that the image size adapts to the pane size. */ public class ImageViewPane extends Region { /** * The contained ImageView, stored in a property. */ private ObjectProperty<ImageView> mImageViewProperty = new SimpleObjectProperty<>(); /** * Getter for the contained ImageView property. * * @return The imageView property. */ public final ObjectProperty<ImageView> imageViewProperty() { return mImageViewProperty; } /** * Get the ImageView of the pane. * * @return The ImageView. */ public final ImageView getImageView() { return mImageViewProperty.get(); } /** * Set the imageView of the pane. * * @param imageView * The imageView to be set. */ public final void setImageView(final ImageView imageView) { this.mImageViewProperty.set(imageView); } /** * Creating an ImageViewPane without imageView. */ public ImageViewPane() { mImageViewProperty.addListener(new ChangeListener<ImageView>() { @Override public void changed(final ObservableValue<? extends ImageView> arg0, final ImageView oldImageView, final ImageView newImageView) { if (oldImageView != null) { getChildren().remove(oldImageView); } if (newImageView != null) { getChildren().add(newImageView); } } }); } @Override protected final void layoutChildren() { ImageView imageView = mImageViewProperty.get(); if (imageView != null) { imageView.setFitWidth(getWidth()); double newHeight = getWidth() * imageView.getImage().getHeight() / imageView.getImage().getWidth(); imageView.setFitHeight(newHeight); layoutInArea(imageView, 0, 0, getWidth(), newHeight, 0, HPos.CENTER, VPos.CENTER); } super.layoutChildren(); } }