Quiero una imagen cambiar de tamaño automáticamente cuando el usuario arrastra la ventana principal. Es eso posible?

Tengo el siguiente código que establece una ventana de un tamaño determinado. También carga la imagen desde una URL externa.

@Override
public void start(Stage primaryStage) {

    MenuBar menuBar=new MenuBar();
    Menu menuGame = new Menu("Game");
    MenuItem newGame = new MenuItem("New Game                F1");
    MenuItem exit = new MenuItem("Exit                            F2");
    exit.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            primaryStage.close();
        }

    });
    menuGame.getItems().addAll(newGame,new SeparatorMenuItem(),exit);
    menuBar.getMenus().addAll(menuGame);

    Image image = new Image("http://docs.oracle.com/javafx/"
    + "javafx/images/javafx-documentation.png");
    ImageView imageView = new ImageView();
    imageView.setImage(image);


    VBox vbox=new VBox();
    StackPane root=new StackPane();
    root.getChildren().addAll(imageView);

    vbox.getChildren().addAll(menuBar,root);

    Scene scene= new Scene(vbox,400,400);
    primaryStage.setScene(scene);

    primaryStage.setMaxHeight(800);
    primaryStage.setMinHeight(400);
    primaryStage.setMaxWidth(1000);
    primaryStage.setMinWidth(800);

    primaryStage.setTitle("Minesweeper");
    primaryStage.show();

}
InformationsquelleAutor Tony | 2014-04-10

4 Comentarios

  1. 8

    De aplicar la solución a JavaFx cambiar tamaño de imagen a su código de muestra y el tamaño de la ventana de resultados en diferentes tamaños de la imagen para mí.

    Cómo cambiar el tamaño de una imagen al cambiar el tamaño de la ventana en JavaFX
    Cómo cambiar el tamaño de una imagen al cambiar el tamaño de la ventana en JavaFX

    import javafx.application.Application;
    import javafx.beans.property.*;
    import javafx.beans.value.*;
    import javafx.event.*;
    import javafx.geometry.HPos;
    import javafx.geometry.VPos;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.image.*;
    import javafx.scene.layout.*;
    import javafx.stage.Stage;
    public class ImageResizer extends Application {
    @Override
    public void start(Stage primaryStage) {
    MenuBar menuBar=new MenuBar();
    Menu menuGame = new Menu("Game");
    MenuItem newGame = new MenuItem("New Game                F1");
    MenuItem exit = new MenuItem("Exit                            F2");
    exit.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
    primaryStage.close();
    }
    });
    menuGame.getItems().addAll(newGame,new SeparatorMenuItem(),exit);
    menuBar.getMenus().addAll(menuGame);
    Image image = new Image("http://docs.oracle.com/javafx/"
    + "javafx/images/javafx-documentation.png");
    ImageView imageView = new ImageView();
    imageView.setImage(image);
    ImageViewPane viewPane = new ImageViewPane(imageView);
    VBox vbox=new VBox();
    StackPane root=new StackPane();
    root.getChildren().addAll(viewPane);
    vbox.getChildren().addAll(menuBar,root);
    VBox.setVgrow(root, Priority.ALWAYS);
    Scene scene= new Scene(vbox,200,200);
    primaryStage.setScene(scene);
    primaryStage.setMaxHeight(400);
    primaryStage.setMinHeight(200);
    primaryStage.setMaxWidth(500);
    primaryStage.setMinWidth(400);
    primaryStage.setTitle("Minesweeper");
    primaryStage.show();
    }
    public static void main(String[] args) { launch(); }
    }
    /*
    * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    */
    /**
    *
    * @author akouznet
    */
    class ImageViewPane extends Region {
    private ObjectProperty<ImageView> imageViewProperty = new SimpleObjectProperty<ImageView>();
    public ObjectProperty<ImageView> imageViewProperty() {
    return imageViewProperty;
    }
    public ImageView getImageView() {
    return imageViewProperty.get();
    }
    public void setImageView(ImageView imageView) {
    this.imageViewProperty.set(imageView);
    }
    public ImageViewPane() {
    this(new ImageView());
    }
    @Override
    protected void layoutChildren() {
    ImageView imageView = imageViewProperty.get();
    if (imageView != null) {
    imageView.setFitWidth(getWidth());
    imageView.setFitHeight(getHeight());
    layoutInArea(imageView, 0, 0, getWidth(), getHeight(), 0, HPos.CENTER, VPos.CENTER);
    }
    super.layoutChildren();
    }
    public ImageViewPane(ImageView imageView) {
    imageViewProperty.addListener(new ChangeListener<ImageView>() {
    @Override
    public void changed(ObservableValue<? extends ImageView> arg0, ImageView oldIV, ImageView newIV) {
    if (oldIV != null) {
    getChildren().remove(oldIV);
    }
    if (newIV != null) {
    getChildren().add(newIV);
    }
    }
    });
    this.imageViewProperty.set(imageView);
    }
    }

    Enfoques alternativos y adicionales de información sobre la base de los comentarios

    Si usted tiene que hacer todo eso, entonces es una debilidad en la plataforma JavaFX. Idealmente, yo esperaría que hubiera sido una propiedad de escala en la imagen a la que se puede establecer para que se utiliza la Gráfica para determinar su tamaño.

    La solución presentada es sólo una respuesta, hay otros posibles. La escena gráfica puede ser utilizado por la unión de diversas propiedades de la anchura y la altura del nodo padre o reemplazando layoutChildren en el nodo primario.

    Propiedades relacionadas con:

    Prefiero la región subclase enfoque a escala de la propiedad o transformar el enfoque basado en porque entonces la imagen se ajusta automáticamente basado en el gestor de diseño. El ImageViewPane definido anteriormente, es sólo una definición de clase que pueden ser reutilizados tanto como usted desea, el código de la aplicación para utilizar un ImageView o ImageViewPane es prácticamente equivalente.

    Otro posible enfoque es el uso de una Región de la subclase (tales como un Panel), que tiene definido un estilo CSS de la clase o id y, a continuación, definir el imagen en CSS como fondo. La cosa agradable sobre un CSS define la imagen es que se puede usar CSS basado en los atributos para definir las cosas, como el tamaño, la escala, el posicionamiento y las repeticiones de la imagen. Este de fondo también puede ser establecer mediante programación si lo desea, en lugar de a través de CSS.

    Relacionadas con la pregunta:

    Manteniendo las proporciones de altura y anchura de la imagen

    El código siguiente puede utilizarse en la ImageViewPane clase proporcionada anteriormente:

    if (imageView.isPreserveRatio()) {
    if (getHeight() > getWidth()) {
    imageView.setFitWidth(getWidth());
    imageView.setFitHeight(0);
    } else {
    imageView.setFitWidth(0);
    imageView.setFitHeight(getHeight());
    }
    } else {
    imageView.setFitWidth(getWidth());
    imageView.setFitHeight(getHeight());
    }
    • Si usted tiene que hacer todo eso, entonces es una debilidad en la plataforma JavaFX. Idealmente, yo esperaría que hubiera sido una propiedad de escala en la imagen a la que se puede establecer para que se utiliza la Gráfica para determinar su tamaño.
  2. 1

    Sólo uso normal panel con una imagen de fondo, aquí el css necesario.

    #titleImage{
    -fx-background-image: url("../img/logo.png");
    -fx-background-repeat: stretch; 
    -fx-background-position: center center;
    }
  3. 0

    Usted está buscando para cambiar el tamaño de una imagen real, o simplemente hacia el centro?

    Que usted puede probar esto: VBox.setVgrow(root, Priority.ALWAYS); y ver si eso es lo que quieres.

    También, tenga cuidado con la imagen, porque es un png de la imagen. Soy un poco escéptico con respecto a lo que no cambia de tamaño (el real de la imagen o el fondo transparente).

    • Yo no quiero eso. Para dar una idea, abrir el buscaminas de windows 7 y para cambiar el tamaño de la ventana arrastrando. Usted notará que las imágenes en la red (los cuadrados) cambiará de tamaño en consecuencia
  4. 0

    Sé que esto es viejo, pero alguien como yo puede tropezar con esta así que aquí está mi solución. Estoy asumiendo que raíz es el nodo raíz de la escena. Sin embargo, esto debería funcionar si su nodo padre de la ImageView es cualquier niño de Panel.

    imv = new ImageView();  
    root.getChildren().add(imv);
    Image image = new Image(Main.class.getResourceAsStream("image.png"))
    imv.setImage(image);
    imv.fitWidthProperty().bind(center.widthProperty());
    imv.fitHeightProperty().bind(center.heightProperty());
    • ¿qué es exactamente el center en las dos líneas de fondo?

Dejar respuesta

Please enter your comment!
Please enter your name here