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

これは、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);
    }
}
于 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 に答える