当前位置: 首页 > 知识库问答 >
问题:

JavaFX GridPane的大小相等的瓷砖在添加图像时没有保持正确的大小

杜弘光
2023-03-14

我试图在JavaFX中使用GridPane制作一个简单的国际象棋游戏,但我无法使棋盘GUI正常工作。当格网窗格中的块被添加到瓷砖上时,其他没有任何块的瓷砖就会被拉伸或收缩。我希望所有的瓷砖网格窗格总是相同的大小。GridPane中的瓷砖是StackPanes。我想将它们保留为StackPanes,以便将来可以在上面覆盖另一个图像或一些文本。

下面是它的样子(抱歉颜色难看):

注意,当所有的瓷砖上都有碎片时,它看起来就像我想要的那样:


import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class SOQuestion extends Application{
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        final int boardSize = 10;
        final GridPane gridPane = new GridPane();
        gridPane.setMinSize(200, 200);
        for (int i = 0; i < boardSize; i++) {
            final ColumnConstraints columnConstraints = new ColumnConstraints(Control.USE_PREF_SIZE, Control.USE_COMPUTED_SIZE, Double.MAX_VALUE);
            columnConstraints.setHgrow(Priority.ALWAYS);
            columnConstraints.setFillWidth(true);
            gridPane.getColumnConstraints().add(columnConstraints);

            final RowConstraints rowConstraints = new RowConstraints(Control.USE_PREF_SIZE, Control.USE_COMPUTED_SIZE, Double.MAX_VALUE);
            rowConstraints.setVgrow(Priority.ALWAYS);
            rowConstraints.setFillHeight(true);
            gridPane.getRowConstraints().add(rowConstraints);
        }

        Color color1 = new Color(1.0,0,0,1);
        Color color2 = new Color(0,1.0,0, 1);

        for (int i = 0; i < boardSize; i++) {
            for (int j = 0; j < boardSize; j++) {
                StackPane child = new StackPane();

                SOQuestion.WrappedImageView img = new SOQuestion.WrappedImageView(new Image(getClass().getResourceAsStream(
                        "/resources/knight_black.png")));

                child.setBackground(new Background(
                    new BackgroundFill((i+j) % 2 == 0 ? color1 : color2, CornerRadii.EMPTY, Insets.EMPTY)));

                if(Math.random() < 0.1) //to randomly place pieces around the board for demonstration
                    child.getChildren().addAll(img);

                child.setMinSize(0,0);

                GridPane.setRowIndex(child, i);
                GridPane.setColumnIndex(child, j);
                gridPane.getChildren().add(child);
            }
        }

        Scene scene = new Scene(gridPane, 800, 600);

        primaryStage.setScene(scene);
        primaryStage.show();
    }
    class WrappedImageView extends ImageView
    {
        WrappedImageView(Image im)
        {
            super(im);
            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);
        }
    }
}

事先感谢你的帮助;很抱歉这么长的帖子!

编辑:我还想确保调整窗口大小时,瓷砖和网格窗格的大小适当,以便它填充整个窗口,就像它对当前代码所做的那样。

共有1个答案

濮阳振海
2023-03-14

按照James_D的建议使用SetPercentWidth(100.0/BoardSize)SetPercentHeight(100.0/BoardSize)就像一个魅力。我决定坚持使用GridPane而不是TilePane,因为它更适合我计划在程序中做的其他事情。谢谢!

 类似资料:
  • 问题内容: 即时通讯试图在Java的内存中调整bufferdImage的大小,但要保持图像的长宽比,即时通讯有类似这样的内容,但这不好 问题答案: 您可以查看perils-of-image- getscaledinstance.html ,它解释了为什么应避免在某些答案中使用的原因。 本文还提供了替代代码。

  • 问题内容: 在Django中上传图片后,如何轻松调整其大小?我正在使用Django 1.0.2,并且已经安装了PIL。 我当时正在考虑重写Model的save()方法以调整其大小,但是我真的不知道如何开始并覆盖它。 有人可以指出我正确的方向吗?谢谢 :-) @GuðmundurH:这将不起作用,因为django-stdimage软件包在Windows上不起作用 问题答案: 在这种方法中,你可以将块

  • 我正在尝试优化一个页面,该页面由带有断点的图像网格组成,使其使用1、2、3或4列。 html看起来像这样:

  • 我搜索关于如何减少由瓷砖添加的一些样板的想法。下面是我的项目的组织方式。 在我的spring-mvc配置中,我以这种方式配置了瓷砖: 我使用的主布局定义在/WEB-INF/layouts/layouts.xml中: ...使用的模板(/WEB-INF/layouts/default.jspx)类似于以下内容: 正如您可能从spring config中猜到的,实际的视图定义位于“/WEB-INF/v

  • 我想知道我是否可以设置div比率响应像一个图像在CSS。例如,我有一个图像(800px x400px),并将css设置为宽度:100%。当我使用桌面屏幕(widht:1400px)时,图像将自动调整大小,得到屏幕全宽=>图像大小(1400px x 700px)。但是元素,我必须同时设置宽度和高度有办法设置空宽度800px,高度400px,它将根据屏幕大小自动调整大小,并且它仍然像图像一样保持比例。

  • 我试图将我的java应用程序迁移到Spring Boot。目前,我正在运行带有Apache Tiles的Spring MVC 3.2。当我迁移到Spring Boot时,我的控制器仍然被称为好的,它们将视图传递给视图解析程序,但是当Tiles去拉JSP文件时,事情就分崩离析了。我得到的错误消息是: 有没有人成功地使用了带有Spring Boot的Apache Tiles?知道怎么做吗? 提前感谢您