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

rbs*_*rbs 32 scaling imageview javafx-2

如何在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();
}
Run Code Online (Sandbox Code Playgroud)

The*_*Cat 58

@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();
}
Run Code Online (Sandbox Code Playgroud)

  • 我怎样才能在fxml中设置它 (13认同)
  • \*facepalm\*真的吗?布局系统本身不能做到这一点? (9认同)
  • JavaFX2很简单,但并不总是不言自明.一旦你习惯了概念,它就变得轻而易举. (2认同)
  • 我选择了:`img.setPreserveRatio(true); .img.fitWidthProperty()结合(stage.widthProperty()); .img.fitHeightProperty()结合(stage.heightProperty());` (2认同)

小智 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

 img_view1.fitWidthProperty().bind(scrollpane_imageview1.widthProperty()); 
 img_view1.fitHeightProperty().bind(scrollpane_imageview1.heightProperty());
Run Code Online (Sandbox Code Playgroud)

  • 如何在 FXML 中设置它? (6认同)