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

JavaFX - Gridpane Growing Issue

长孙玉泽
2023-03-14

嗨,我目前正在玩JavaFX中的GridPane,偶然发现了一个问题...我想创建一个包含三行的布局,其中中间一行增长并占用所有可用空间,但我就是无法让它工作。中间行变得太大,并将窗口下方的底部行“推”到不再可见的位置...我如何使底部行始终在底部,让中间行占用中间的可用空间,但不能再这样了...我将在下面粘贴我的代码。

谢啦!

(注意:为清晰起见,代码略有改动,但工作方式相同)

RowConstraints row1 = new RowConstraints(25);
row1.setVgrow(Priority.NEVER);

RowConstraints row2 = new RowConstraints();
row2.setVgrow(Priority.ALWAYS);

RowConstraints row3 = new RowConstraints(25);
row3.setVgrow(Priority.NEVER);

ColumnConstraints column1 = new ColumnConstraints();
column1.setPercentWidth(100);

gridPane.getRowConstraints().add(0, row1);
gridPane.getRowConstraints().add(1, row2);
gridPane.getRowConstraints().add(2, row3);

gridPane.getColumnConstraints().add(0, column1);

gridPane.add(node1, 0, 0);
gridPane.add(node2, 0, 1);
gridPane.add(node3, 0, 2);

更新!添加“最小、完整和可验证的示例”

Test.java

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.MenuBar;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.RowConstraints;
import javafx.stage.Stage;

public class Test extends Application {

    @Override
    public void start(Stage primaryStage) {
        GridPane grid = new GridPane();

        MenuBar menuBar = new MenuBar();
        TestPane pane = new TestPane();

        RowConstraints menuRow = new RowConstraints(25);

        RowConstraints regRow = new RowConstraints();
        regRow.setPercentHeight(100);

        ColumnConstraints regColumn = new ColumnConstraints();
        regColumn.setPercentWidth(100);

        grid.getColumnConstraints().addAll(regColumn);
        grid.getRowConstraints().addAll(menuRow, regRow);

        grid.add(menuBar, 0, 0);
        grid.add(pane, 0, 1);

        Scene scene = new Scene(grid, 500, 350);

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

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

TestPane.java

import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;

public class TestPane extends GridPane {

    public TestPane() {
        RowConstraints fixedRow = new RowConstraints(25);
        fixedRow.setVgrow(Priority.NEVER);

        RowConstraints growingRow = new RowConstraints();
        growingRow.setVgrow(Priority.ALWAYS);

        ColumnConstraints column = new ColumnConstraints();
        column.setPercentWidth(100);

        this.getRowConstraints().addAll(fixedRow, growingRow, fixedRow);
        this.getColumnConstraints().addAll(column);

        TextField field1 = new TextField();
        ListView list = new ListView<>();
        TextField field2 = new TextField();

        this.add(field1, 0, 0);
        this.add(list, 0, 1);
        this.add(field2, 0, 2);
    }
}

共有1个答案

颛孙铭
2023-03-14

在“外部”容器(即“测试”中定义的网格窗格)中,您有两行。顶行固定为 25 像素,而将第二行设置为容器高度的 100%。这些显然是矛盾的。(我认为)发生的事情是,第二行的内容被分配与网格窗格本身相同的高度(因为您将百分比高度设置为100%),但是由于没有足够的空间来显示所有内容,因此会被剪切。

不用设置高度百分比,只需像在< code>TestPane中一样设置< code>vgrow属性:

RowConstraints menuRow = new RowConstraints(25);

RowConstraints regRow = new RowConstraints();
//  regRow.setPercentHeight(100);
regRow.setVgrow(Priority.ALWAYS);
 类似资料:
  • 我有一个JavaFX应用程序,它可以与服务器通信并从服务器获取数据。接收到的数据被放入ObservableList并显示在TableView中。 与服务器的通信在它自己的线程中运行,当调用观测ist.add它会触发一个IllegalStateException(抱怨不是事件线程/不是JavaFX线程) 我已经找到了一个类似问题的以下解决方案,但我不确定如何采用该解决方案,因为在我的情况下,与服务器

  • 最近Sun公司推出了JavaFX框架,使用它可以利用JavaFX编程语言来开发富互联网应用程序(RIA)。这个新开发组件有许多 令人惊喜的地方。它的功能非常丰富,对于Java开发者来说,它的类Java语法可以让人们非常轻松的动手开发富互联网应用程序。但是它面临两个重量级的 竞争对手,Adobe和微软,它们分别推出了Flex/AIR和Silverlight,来帮助程序员开发富互联网程序,它们不仅更加

  • 我使用OpenJDK 11和OpenJFX 11.0.1与Gradle在IntelliJ IDEA为我的项目。当我使用javafx.base模块时,IntelliJ IDEA在第1行(项目模块声明)报告了一个错误,说我没有在模块需求中包含javafx.beans模块(bean是javafx.base模块中的一个包)。Gradle jar任务执行时没有任何错误或警告,因此此错误可能与IntelliJ

  • 本文向大家介绍javafx TextInputDialog,包括了javafx TextInputDialog的使用技巧和注意事项,需要的朋友参考一下 示例 TextInputDialog允许用户要求输入一个String。            

  • 本文向大家介绍javafx AnchorPane,包括了javafx AnchorPane的使用技巧和注意事项,需要的朋友参考一下 示例 AnchorPane 是一种布局,允许将内容放置在距离其侧面特定距离的位置。 有4种设置方法和4种获取距离的方法AnchorPane。这些方法的第一个参数是child Node。设置器的第二个参数是Double要使用的值。该值可以null指示给定边没有约束。 s

  • 我刚刚安装了JDK8,以使用WebView,但我得到了一个错误。错误是这样的: 我不知道为什么Swing没有嵌入到JavaFX for JDK8,但是有人知道如何解决这个问题吗? “Java-版本输出” Java版本“1.8.0_11”Java(TM)SE运行时环境(Build1.8.0_11-B12)Java HotSpot(TM)64位服务器VM(Build25.11-B03,混合模式) 问题

  • 主要内容:DatePicker创建,自定义日期选择器,DateCell,示例JavaFX 允许从给定日历中选择一天。控件包含一个带有日期字段和日期选择器的组合框。JavaFX DatePicker控件使用JDK8日期时间API。 上面的代码生成以下结果。 DatePicker创建 我们可以创建一个并在类构造函数中设置一个特定的日期值。 还可以使用方法设置日期值。 以下代码使用向结束添加更多时间。 上面的代码生成以下结果。 自定义日期选择器 可以通过使用方法来启用和禁用在中

  • 主要内容:示例,VBox间距,设置填充和间距VBox布局将子节点堆叠在垂直列中。新添加的子节点被放置在上一个子节点的下面。默认情况下,VBox尊重子节点的首选宽度和高度。 当父节点不可调整大小时,例如节点,最大垂直列的宽度基于具有最大优选宽度的节点。 默认情况下,每个子节点与左上()位置对齐。 示例 以下代码将控件设置为在调整父的高度时垂直增长: 完整的代码如下所示- 上面的代码生成以下结果。 下面的代码使用四个矩形来演示的使用。 上面的代