如何让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();
}
答案 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);