Redimensionnement des images pour s'adapter au noeud parent

Comment puis-je obtenir une image dans une ImageView pour la redimensionner automatiquement de telle sorte qu'elle corresponde toujours au noeud parent?

Voici un petit exemple de code:

@Override
public void start(Stage stage) throws Exception {
    BorderPane pane = new BorderPane();
    ImageView img = new ImageView("http://...");

    //didn't work for me:
    //img.fitWidthProperty().bind(new SimpleDoubleProperty(stage.getWidth())); 

    pane.setCenter(img);

    Scene scene = new Scene(pane);
    stage.setScene(scene);
    stage.show();
}
29
demandé sur The Unfun Cat 2012-09-28 01:30:00

5 réponses

@Override
public void start(Stage stage) throws Exception {
    BorderPane pane = new BorderPane();
    ImageView img = new ImageView("http://...");

    img.fitWidthProperty().bind(stage.widthProperty()); 

    pane.setCenter(img);

    Scene scene = new Scene(pane);
    stage.setScene(scene);
    stage.show();
}
50
répondu The Unfun Cat 2012-09-28 07:39:29

Il s'agit d'une meilleure solution que de lier la propriété width (mieux car souvent lorsqu'on lie un enfant à son contenant, il n'est pas possible de rendre le contenant plus petit. À d'autres endroits, le conteneur pourrait même commencer à se développer automatiquement).

la solution ci-dessous repose sur le fait de surcharger une vue ImageView pour qu'elle se comporte comme 'redimensionnable' et ensuite de fournir des implémentations pour les largeurs/hauteurs minimales ,préférées et maximales. Aussi important est de réellement mettre en œuvre les redimensionner ().

class WrappedImageView extends ImageView
{
    WrappedImageView()
    {
        setPreserveRatio(false);
    }

    @Override
    public double minWidth(double height)
    {
        return 40;
    }

    @Override
    public double prefWidth(double height)
    {
        Image I=getImage();
        if (I==null) return minWidth(height);
        return I.getWidth();
    }

    @Override
    public double maxWidth(double height)
    {
        return 16384;
    }

    @Override
    public double minHeight(double width)
    {
        return 40;
    }

    @Override
    public double prefHeight(double width)
    {
        Image I=getImage();
        if (I==null) return minHeight(width);
        return I.getHeight();
    }

    @Override
    public double maxHeight(double width)
    {
        return 16384;
    }

    @Override
    public boolean isResizable()
    {
        return true;
    }

    @Override
    public void resize(double width, double height)
    {
        setFitWidth(width);
        setFitHeight(height);
    }
}
8
répondu 2016-04-21 13:34:56

Utilisez le ScrollPane ou simplement Pane pour surmonter ce problème: Exemple:

 img_view1.fitWidthProperty().bind(scrollpane_imageview1.widthProperty()); 
 img_view1.fitHeightProperty().bind(scrollpane_imageview1.heightProperty());
4
répondu Akshay Goyal 2014-09-16 15:18:26

si vous voulez que L'ImageView s'insère dans un cadre windows, utilisez cette ligne de code: imageView.fitWidthProperty ().bind(scène.widthProperty()).

notez que j'utilise widthProperty de la scène pas la scène. Exemple:

import java.io.FileNotFoundException;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;

public class MapViewer extends Application {

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

    @Override
    public void start(Stage primaryStage) throws FileNotFoundException {
        String strTitle = "Titulo de la Ventana";
        int w_width = 800;
        int w_height = 412;
        primaryStage.setTitle(strTitle);
        primaryStage.setWidth(w_width);
        primaryStage.setHeight(w_height);

        Group root = new Group();
        Scene scene = new Scene(root);

        final ImageView imv = new ImageView("file:C:/Users/utp/Documents/1.2008.png");
        imv.fitWidthProperty().bind(scene.widthProperty());
        imv.setPreserveRatio(true);

        root.getChildren().add(imv);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

}

l'aspect radio de la scène (primaryStage) doit être similaire à celui de l'image (1.2008.png)

1
répondu dew 2016-11-24 19:36:25

il s'agit d'une méthode de largeur calculée qui supprime la largeur de la barre de défilement.

le premier:

myImageView.setPreserveRatio(true);

moniteur de la barre de défilement de la largeur de changements:

scrollPane.widthProperty().addListener((observable, oldValue, newValue) -> {
            myImageView.setFitWidth(newValue.doubleValue() - (oldValue.doubleValue() - scrollPane.getViewportBounds().getWidth()));
        });

largeur de la barre de défilement:

oldValue.doubleValue() - scrollPane.getViewportBounds().getWidth()

comment définir la largeur d'entrée?

après primaryStage.show();

myImageView.setFitWidth(scrollPane.getViewportBounds().getWidth());

0
répondu sambuca 2017-11-23 07:46:35