在JavaFX中调整窗口大小时如何调整图像大小

托尼

我希望在用户拖动主窗口时自动调整图像大小。那可能吗?

我有以下代码来设置一定大小的窗口。它还从外部URL加载图像。

@Override
public void start(Stage primaryStage) {

    MenuBar menuBar=new MenuBar();
    Menu menuGame = new Menu("Game");
    MenuItem newGame = new MenuItem("New Game                F1");
    MenuItem exit = new MenuItem("Exit                            F2");
    exit.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            primaryStage.close();
        }

    });
    menuGame.getItems().addAll(newGame,new SeparatorMenuItem(),exit);
    menuBar.getMenus().addAll(menuGame);

    Image image = new Image("http://docs.oracle.com/javafx/"
    + "javafx/images/javafx-documentation.png");
    ImageView imageView = new ImageView();
    imageView.setImage(image);


    VBox vbox=new VBox();
    StackPane root=new StackPane();
    root.getChildren().addAll(imageView);

    vbox.getChildren().addAll(menuBar,root);

    Scene scene= new Scene(vbox,400,400);
    primaryStage.setScene(scene);

    primaryStage.setMaxHeight(800);
    primaryStage.setMinHeight(400);
    primaryStage.setMaxWidth(1000);
    primaryStage.setMinWidth(800);

    primaryStage.setTitle("Minesweeper");
    primaryStage.show();

}
宝石海

将解决方案应用于将JavaFx图像大小调整为示例代码并调整窗口大小后,对我来说将产生不同的图像大小。

尺寸默认 给你

import javafx.application.Application;
import javafx.beans.property.*;
import javafx.beans.value.*;
import javafx.event.*;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class ImageResizer extends Application {
    @Override
    public void start(Stage primaryStage) {
        MenuBar menuBar=new MenuBar();
        Menu menuGame = new Menu("Game");
        MenuItem newGame = new MenuItem("New Game                F1");
        MenuItem exit = new MenuItem("Exit                            F2");
        exit.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                primaryStage.close();
            }
        });
        menuGame.getItems().addAll(newGame,new SeparatorMenuItem(),exit);
        menuBar.getMenus().addAll(menuGame);

        Image image = new Image("http://docs.oracle.com/javafx/"
                + "javafx/images/javafx-documentation.png");
        ImageView imageView = new ImageView();
        imageView.setImage(image);

        ImageViewPane viewPane = new ImageViewPane(imageView);

        VBox vbox=new VBox();
        StackPane root=new StackPane();
        root.getChildren().addAll(viewPane);

        vbox.getChildren().addAll(menuBar,root);
        VBox.setVgrow(root, Priority.ALWAYS);

        Scene scene= new Scene(vbox,200,200);
        primaryStage.setScene(scene);

        primaryStage.setMaxHeight(400);
        primaryStage.setMinHeight(200);
        primaryStage.setMaxWidth(500);
        primaryStage.setMinWidth(400);

        primaryStage.setTitle("Minesweeper");
        primaryStage.show();

    }
    public static void main(String[] args) { launch(); }
}





/*
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 */


/**
 *
 * @author akouznet
 */
class ImageViewPane extends Region {

    private ObjectProperty<ImageView> imageViewProperty = new SimpleObjectProperty<ImageView>();

    public ObjectProperty<ImageView> imageViewProperty() {
        return imageViewProperty;
    }

    public ImageView getImageView() {
        return imageViewProperty.get();
    }

    public void setImageView(ImageView imageView) {
        this.imageViewProperty.set(imageView);
    }

    public ImageViewPane() {
        this(new ImageView());
    }

    @Override
    protected void layoutChildren() {
        ImageView imageView = imageViewProperty.get();
        if (imageView != null) {
            imageView.setFitWidth(getWidth());
            imageView.setFitHeight(getHeight());
            layoutInArea(imageView, 0, 0, getWidth(), getHeight(), 0, HPos.CENTER, VPos.CENTER);
        }
        super.layoutChildren();
    }

    public ImageViewPane(ImageView imageView) {
        imageViewProperty.addListener(new ChangeListener<ImageView>() {

            @Override
            public void changed(ObservableValue<? extends ImageView> arg0, ImageView oldIV, ImageView newIV) {
                if (oldIV != null) {
                    getChildren().remove(oldIV);
                }
                if (newIV != null) {
                    getChildren().add(newIV);
                }
            }
        });
        this.imageViewProperty.set(imageView);
    }
}

基于评论的替代方法和其他信息

如果必须执行所有这些操作,那么JavaFX平台就是一个弱点。理想情况下,我希望可以在图像上设置一个scale属性,以便它使用SceneGraph来确定其大小。

上面介绍的解决方案只是一个答案,还有其他可能。可以通过将各种属性绑定到父节点的宽度和高度或通过覆盖父节点中的layoutChildren来使用场景图

相关属性:

  • 有一个scale属性可以应用于任何节点。
  • 节点也有一个变换表,其一个尺度可以被应用。
  • ImageView具有fitWidth和fitHeight属性(在其他答案中对此进行了演示)。

我更喜欢使用区域子类方法而不是基于比例尺属性或基于变换的方法,因为这样会根据布局管理器自动调整图像的大小。上面定义的ImageViewPane只是一个一次性的定义类,可以随意重用,使用ImageView或ImageViewPane的实际应用程序代码几乎等效。

另一种可能的方法是使用具有定义的CSS样式类或id的Region子类(例如Pane),然后将CSS中图像定义为backgroundCSS定义图像的好处是,您可以使用其他基于CSS的属性来定义内容,例如图像的大小,缩放,定位和重复。如果需要,也可以通过编程而不是通过CSS设置背景

相关问题:

保持图像的高度和宽度成比例

可以在上面提供的ImageViewPane类中使用以下代码:

if (imageView.isPreserveRatio()) {
    if (getHeight() > getWidth()) {
        imageView.setFitWidth(getWidth());
        imageView.setFitHeight(0);
    } else {
        imageView.setFitWidth(0);
        imageView.setFitHeight(getHeight());
    }
} else {
    imageView.setFitWidth(getWidth());
    imageView.setFitHeight(getHeight());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Matlab GUI:调整GUI窗口大小时,调整图像大小(加载到按钮)

来自分类Dev

调整窗口大小时修改图像大小(jQuery)

来自分类Dev

如何在WPF中调整窗口大小时缩放按钮

来自分类Dev

调整窗口大小时如何调整ListView控件的大小

来自分类Dev

调整窗口大小时居中对齐图像css

来自分类Dev

如何在javafx中调整imageview图像的大小?

来自分类Dev

浏览器窗口调整大小时如何在CSS中调整梯形大小

来自分类Dev

调整大小时使图像居中

来自分类Dev

调整窗口高度时调整图像的大小

来自分类Dev

调整窗口大小时,图像高度不会调整

来自分类Dev

调整大小时如何防止图像填充整个Tkinter窗口?

来自分类Dev

ScalaFX(JavaFX):舞台内容不会在窗口调整大小时调整大小

来自分类Dev

在Shrine中调整原始图像大小时如何上传

来自分类Dev

调整窗口大小时图像的位置改变

来自分类Dev

ReactJS。图像在调整窗口大小时消失

来自分类Dev

调整窗口大小时从CSS顶部的锚图像

来自分类Dev

调整窗口大小时如何调整布局?

来自分类Dev

调整窗口大小时自动调整TableLayoutPanel行的大小

来自分类Dev

调整窗口大小时如何使图像流畅?

来自分类Dev

调整窗口大小时固定图像位置

来自分类Dev

调整大小时图像模糊

来自分类Dev

调整窗口大小时如何调整ListView控件的大小

来自分类Dev

如何在调整窗口大小时重新调整引导程序中的行?

来自分类Dev

在CSS中调整窗口大小时,如何调整身体边框的大小

来自分类Dev

调整窗口高度时调整图像的大小

来自分类Dev

调整窗口大小时如何保持对象大小相同

来自分类Dev

调整大小时响应图像

来自分类Dev

使用 resizeEvent 调整窗口大小时调整 Qlabel 图像大小

来自分类Dev

调整窗口大小时如何自动调整 JFreeChart 的大小

Related 相关文章

  1. 1

    Matlab GUI:调整GUI窗口大小时,调整图像大小(加载到按钮)

  2. 2

    调整窗口大小时修改图像大小(jQuery)

  3. 3

    如何在WPF中调整窗口大小时缩放按钮

  4. 4

    调整窗口大小时如何调整ListView控件的大小

  5. 5

    调整窗口大小时居中对齐图像css

  6. 6

    如何在javafx中调整imageview图像的大小?

  7. 7

    浏览器窗口调整大小时如何在CSS中调整梯形大小

  8. 8

    调整大小时使图像居中

  9. 9

    调整窗口高度时调整图像的大小

  10. 10

    调整窗口大小时,图像高度不会调整

  11. 11

    调整大小时如何防止图像填充整个Tkinter窗口?

  12. 12

    ScalaFX(JavaFX):舞台内容不会在窗口调整大小时调整大小

  13. 13

    在Shrine中调整原始图像大小时如何上传

  14. 14

    调整窗口大小时图像的位置改变

  15. 15

    ReactJS。图像在调整窗口大小时消失

  16. 16

    调整窗口大小时从CSS顶部的锚图像

  17. 17

    调整窗口大小时如何调整布局?

  18. 18

    调整窗口大小时自动调整TableLayoutPanel行的大小

  19. 19

    调整窗口大小时如何使图像流畅?

  20. 20

    调整窗口大小时固定图像位置

  21. 21

    调整大小时图像模糊

  22. 22

    调整窗口大小时如何调整ListView控件的大小

  23. 23

    如何在调整窗口大小时重新调整引导程序中的行?

  24. 24

    在CSS中调整窗口大小时,如何调整身体边框的大小

  25. 25

    调整窗口高度时调整图像的大小

  26. 26

    调整窗口大小时如何保持对象大小相同

  27. 27

    调整大小时响应图像

  28. 28

    使用 resizeEvent 调整窗口大小时调整 Qlabel 图像大小

  29. 29

    调整窗口大小时如何自动调整 JFreeChart 的大小

热门标签

归档