40

如何在 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();
}
4

6 回答 6

64
@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();
}
于 2012-09-28T07:07:56.910 回答
15

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

下面的解决方案依赖于覆盖 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);
    }
}
于 2016-02-04T13:23:25.347 回答
5

使用 ScrollPane 或简单的 Pane 来解决这个问题:示例:

 img_view1.fitWidthProperty().bind(scrollpane_imageview1.widthProperty()); 
 img_view1.fitHeightProperty().bind(scrollpane_imageview1.heightProperty());
于 2014-09-16T15:13:55.583 回答
1

如果您希望 ImageView 适合 Windows 框架,请使用以下代码行: imageView.fitWidthProperty().bind(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)的宽高比相似

于 2016-11-24T18:50:01.533 回答
0

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

第一的:
myImageView.setPreserveRatio(true);

监控滚动条宽度变化:

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

滚动条宽度:
oldValue.doubleValue() - scrollPane.getViewportBounds().getWidth()

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

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

于 2017-11-23T07:46:35.720 回答
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);
于 2020-06-17T23:59:06.080 回答