2012-09-27 24 views
26

¿Cómo obtengo una imagen en un ImageView para cambiar el tamaño automáticamente de modo que siempre se ajuste al nodo primario?Cambiar el tamaño de las imágenes para que quepan en el nodo primario

Aquí es un pequeño ejemplo de código:

@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(); 
} 
+1

pregunta relacionada: [Cómo cambiar el tamaño de una imagen al cambiar el tamaño de la ventana en JavaFX] (http://stackoverflow.com/questions/22993550/how-to-resize-an-image -when-resizing-the-window-in-javafx/22997981? noredirect = 1 # 36027997) – jewelsea

Respuesta

40
@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(); 
} 
+0

thx, eso fue demasiado fácil;) – rbs

+2

JavaFX2 es fácil, pero no siempre es autoexplicativo. Una vez que te acostumbras a los conceptos, es una brisa sin embargo. –

+7

\ * facepalm \ * ¿De verdad? El sistema de diseño no puede hacer esto por sí mismo? –

1

Uso ScrollPane o simplemente panel para superar este problema: Ejemplo:

img_view1.fitWidthProperty().bind(scrollpane_imageview1.widthProperty()); 
img_view1.fitHeightProperty().bind(scrollpane_imageview1.heightProperty()); 
+6

¿Cómo puedo configurarlo en el FXML? – Tomi

+0

No funciona. Si cambio el tamaño de la ventana, el ancho y el alto del panel se mantienen iguales y, por lo tanto, la imagen también. – T3rm1

6

Esta es una solución mejor que la unión de la anchura propiedad (mejor porque a menudo al vincular a un niño a su contenedor, es posible que no sea posible reducir el tamaño del contenedor. En otras ocasiones, el contenedor puede incluso ser automático comienza a crecer).

La siguiente solución se basa en la anulación de un ImageView para que podamos permitir que se comporte como 'redimensionable' y luego proporcionar implementaciones para el ancho/alto mínimos, preferidos y máximos. También es importante implementar realmente la llamada de resize().

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); 
    } 
} 
+0

Gracias, eso fue realmente útil – sixtstorm1

+0

Solución muy buena y funcional. Gracias –

+0

Para gente como yo que también quería que sea el centro, mira aquí https://stackoverflow.com/questions/32781362/centering-an-image-in-an-imageview; en lugar de setX setY usa setTranslateX setTranslateY, coloca la llamada central dentro del método de cambio de tamaño. –

1

Si desea que el ImageView para caber dentro de un marco de ventanas, utilice esta línea de código:. imageView.fitWidthProperty() se unen (scene.widthProperty()).

Tenga en cuenta que estoy usando widthProperty de la escena, no el escenario. Ejemplo:

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(); 

    } 

} 

La radio aspecto de la etapa (primaryStage) debe ser similar a la de la imagen (1.2008.png)

0

Este es un método anchura calculada que elimina la anchura de la barra de desplazamiento .

primeros:
myImageView.setPreserveRatio(true);

monitor cambia la anchura barra de desplazamiento:

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

ancho scrollBar:
oldValue.doubleValue() - scrollPane.getViewportBounds().getWidth()

¿Cómo puedo configurar init Ancho?
después primaryStage.show();

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

Cuestiones relacionadas