调整图像大小以适合父节点

时间:2012-09-27 21:30:01

标签: imageview javafx-2 scaling

如何让ImageView中的图像自动调整大小以使其始终适合父节点?

这是一个小代码示例:

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

6 个答案:

答案 0 :(得分:56)

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

答案 1 :(得分:8)

这是比绑定width属性更好的解决方案(更好的是因为通常在将子容器绑定到其容器时,可能无法使容器变小。在其他情况下,容器甚至可能自动开始增长)。

下面的解决方案依赖于覆盖ImageView,以便我们可以让它表现为“可调整大小”,然后提供最小,首选和最大宽度/高度的实现。同样重要的是实际执行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);
    }
}

答案 2 :(得分:4)

使用ScrollPane或简单地使用Pane来克服此问题: 例如:

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

答案 3 :(得分:1)

如果您希望ImageView适合Windows框架,请使用以下代码行:     的 imageView.fitWidthProperty()。绑定(scene.widthProperty())。

请注意,我使用的场景的widthProperty不是舞台。 例如:

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

    }

}

舞台(primaryStage)的方面无线电应该与图像(1.2008.png)相似

答案 4 :(得分:0)

这是一个计算宽度方法,用于删除滚动条的宽度。

第一:
myImageView.setPreserveRatio(true);

监控滚动条宽度更改:

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

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

如何设置初始化宽度?
primaryStage.show();之后

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

答案 5 :(得分:0)

填充父级白平衡比例,这可以解决父级高度和宽度与图像比例不正确时白化的问题。

Image image = new Image(getClass().getResource(%path%).toString());
double ratio = image.getWidth() / image.getHeight();
double width = stage.getScene().getWidth();

ImageView imageView.setImage(image);
imageView.setFitWidth(width);
imageView.setFitHeight(width/ratio);
imageView.setPreserveRatio(true);