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

ScrollPane内部有空隙的GridPane呈现错误

王长卿
2023-03-14

我想有一个矩形网格与正方形细胞,可以缩放和拖动(就像你会一个地图)。所以我把它放在一个滚动窗格里,尽管它在某些尺寸下表现得很奇怪。网格的大小会动态变化。

  1. 并非所有间隙都显示在网格内部。注意,它应该是20格,但不是。Vgap和Hgap均为1。
  2. 网格本身比内容大,这不好,因为当它缩放时,我可能会拖出网格的边界。
  3. 当GridPane小于ScrollPane时,我希望将其居中置于ScrollPane内部。(GridPane alignment=“center”显然没有执行任何操作)

FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.layout.GridPane?>

<ScrollPane hbarPolicy="NEVER" hvalue="0.5" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" pannable="true" prefHeight="400.0" prefWidth="600.0" vbarPolicy="NEVER" vvalue="0.5" xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1" fx:controller="bug.app.Bug">
    <GridPane fx:id="gridPane" alignment="CENTER" hgap="1.0" style="-fx-background-color: red;" vgap="1.0">
    </GridPane>
</ScrollPane>

控制器+主机:

package bug.app;

import javafx.application.Application;
import javafx.beans.binding.DoubleBinding;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Bug extends Application {
    private static final int HEIGHT = 20;
    private static final int WIDTH = 20;
    private static final double MIN_CELL_SIZE = 2;
    @FXML private GridPane gridPane;
    private DoubleProperty zoomRatio = new SimpleDoubleProperty(5);

    @FXML
    private void initialize() {
        final DoubleBinding cellSizeBinding = zoomRatio.multiply(MIN_CELL_SIZE);

        List<Node> cells = new ArrayList<>(HEIGHT * WIDTH);
        for (int row = 0; row < HEIGHT; row++) {
            for (int col = 0; col < WIDTH; col++) {
                final Pane cell = new Pane();
                cell.setBackground(new Background(new BackgroundFill(Color.YELLOW, CornerRadii.EMPTY, Insets.EMPTY)));

                cell.setMinSize(MIN_CELL_SIZE, MIN_CELL_SIZE);
                cell.setMaxWidth(Region.USE_PREF_SIZE);
                cell.setMaxHeight(Region.USE_PREF_SIZE);
                cell.prefWidthProperty().bind(cellSizeBinding);
                cell.prefHeightProperty().bind(cellSizeBinding);

                GridPane.setConstraints(cell, col, row, 1, 1);

                cells.add(cell);
            }
        }
        gridPane.getChildren().clear();
        gridPane.getChildren().addAll(cells);
    }

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

    @Override
    public void start(Stage primaryStage) throws IOException {
        Parent root = FXMLLoader.load(
                getClass().getResource("/view/bugView.fxml"));
        final Scene scene = new Scene(root, 600, 400);

        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

注意:我选择了一个窗格作为单元格,因为我想对它进行子类化,并最终填充它(可能是形状吗?)用不同的颜色将方块分成1-4个部分。想象两个或四个三角形组成一个正方形。我还想调整这个优雅的大小(AFAIK形状是不可调整的),也许以某种方式将内部形状的大小绑定到窗格的大小会有魔力。我还没走到那一步,但也可以就此提出建议。

共有1个答案

艾成益
2023-03-14

将gridpane包装在stackpane内,这将使gridpane居中

 类似资料:
  • 大家好! 我有一个简单的问题:我正在使用FXML文件,我已经做了这样的布局: 使用此层次结构:(顶部GridPane控制器被高亮显示-它位于VBox中) 我的问题是,我在ScrollPane(在另一个GridPane容器内)内动态地向GridPane添加行;我不能添加超过3列(显然是Vbox容器的大小),但是如果我删除滚动窗格,我可以添加尽可能多的行但是行正在消失,因为它们在Vbox/GridPa

  • 我真的很感谢你帮我解决问题。 我正在使用JavaFX和NetBeans IDE。我正在为桌面客户端制作一个非常简单的启动窗口。窗口当前与此图像类似。 当前外观: null 我有一个GridPane作为根。不知道为什么JavaFX选择使用(col,row),但这就是我在下面表示我的设置的方式: @GridPane(0,0)->“欢迎”文本 @GridPane(0,1)->VBox(此VBox包含上图

  • 我正在用JavaFX写一个程序 硼烷- 我希望能够添加尽可能多的行到gridpane,并让scrollpane自动扩展自己。 注意:我有一些很长的文件,所以我只包括重要的部分。如果您需要整个FXML或Controller文件,请给我留言。 以下是我的gridpane/scrollpane的FXML: 我有以下代码在我的控制器内的FXML 谢谢大家的帮助! 瑞恩

  • 我正在尝试为android编程设置IntelliJ IDEA,但我无法呈现main.xml。 RenderingException:这个版本的呈现库比您的IntelliJ IDEA版本更新。请在org.jetbrains.android.uipreview.renderServiceFactor.LoadLibrary(renderServiceFactor.java:158)在org.jetbr

  • 我最近开始了我的第一个libGDX游戏,一切都进行得很好,所有的东西都呈现得很好,但是大约一分钟后什么都没有呈现,呈现调用仍然被发出,并且spritebatch工作得很好,我只是留下了一个黑屏,我甚至把'gl clearcolor()'改成了但我仍然留下了一个黑屏。我不知道这会是什么。 我的主要类: 编辑:我们已经确定,经过一段时间SpriteBatch渲染一个黑色屏幕的红色清晰颜色,它也停止渲染