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

JavaFX:GridPane中的组合框导致不必要的大小调整

宁侯林
2023-03-14

我有一个网格窗格,有5列。这些分别是我对列约束的hgrow设置。

  1. 有时
  2. 始终
  3. 有时(固定大小)
  4. 有时
  5. 始终

整个 GridPane 基本上是两列形式的布局。我的列 1 和 4(索引 0 和 3)是字段标签,而列 2 和 5 是输入字段(文本字段等)。列 3 只是两个表单列之间的固定宽度填充。

我的表单中有一些组合框 - 有些在左列,有些在右列。我已将所有组合框的最大宽度设置为MAX_VALUE

加载表单时,布局与我预期的一样(两个输入字段列的宽度相等)。但是,当我单击任何一个<code>组合框</code>时,会导致单击的<code>复合框</code>所在的列的宽度增加-这会导致另一个输入字段列的宽度减少相同的量。

我可以交替单击左侧和右侧的ComboBox,并且两列的宽度都会不断变化。更改将变得越来越小,最终列将停止调整大小。最终结果是两列的宽度不相等。

我对JFoix库中的另一个控件JFXDatePicker有相同的问题。

我的另一个限制是此表单位于SplitPane中,因此我必须避免设置显式宽度。

我该怎么做才能解决此问题?

考虑到这个问题的观点很少,我想我会在这里附上一个示例。

@Override
public void start(Stage primaryStage) throws Exception {
    VBox root = FXMLLoader.load(getClass().getResource("Test.fxml"));
    Scene sc = new Scene(root);
    primaryStage.setScene(sc);
    primaryStage.show();
}

FXML:

<VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
    <padding>
        <Insets bottom="30.0" left="30.0" right="30.0" top="30.0" />
    </padding>
   <children>
      <GridPane hgap="6.0" vgap="6.0" VBox.vgrow="ALWAYS">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" />
          <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" />
            <ColumnConstraints hgrow="SOMETIMES" />
            <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Label text="Left 1" GridPane.halignment="RIGHT" />
            <Label text="Left 2" GridPane.halignment="RIGHT" GridPane.rowIndex="1" />
            <Label text="Left 3" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
            <Label text="Right 1" GridPane.columnIndex="2" GridPane.halignment="RIGHT" />
            <Label text="Right 2" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.rowIndex="1" />
            <Label text="Right 3" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="3" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="3" GridPane.rowIndex="2" />
         </children>
      </GridPane>
   </children>
</VBox>

结果是:

如GIF所示,布局是我在窗口最初启动时想要的。当我单击右侧的一个组合框时,该列突然增加了其宽度并缩小了另一列。我需要两列的宽度在单击任何组合框时保持恒定。

似乎我在我的问题中遗漏了一些信息。我需要的最终结果是一个 GridPane,其中包含两个标签输入对中的 4 列。可以在对之间添加额外的列,以在对之间添加额外的填充,但这是可选的。整个网格将处于可调整大小的环境中(例如,在我的示例中 - 可调整大小的舞台)。我相信可调整大小的环境不是不合理的,否则我会给所有列绝对大小(甚至使用任何Pane并给它绝对位置),问题就不会存在。

这两个标签必须始终可见(除非整个< code>GridPane被缩小到非常小的尺寸),并且必须给输入控件(< code>TextField、< code>ComboBox等)留出额外的空间。类似地,如果收缩< code>GridPane,我希望收缩的是输入列,而不是标签列。标签列应该始终保持固定的大小,这个大小是显示所有标签而不出现省略号所需的最小大小。

由于最终表单混合了不同的输入控件,如果不将<code>组合框

我还希望两个输入列具有相同的宽度,并且这必须始终保持不变。

我对此进行了错误报告,它目前仍以P3优先级打开。

共有2个答案

慕烨烁
2023-03-14

这是一个很旧的帖子,但我刚刚遇到这个问题,发现最好的方法是动态地将宽度处理程序添加到ComboBox和GridPane,我有一个4 x 2的网格,带有标签/组合/标签/组合很像你做的:

    cmbOne.setOnShowing(e -> detailsGrid.getColumnConstraints().get(1).setMaxWidth(cmbOne.getWidth()));
    cmbTwo.setOnShowing(e -> detailsGrid.getColumnConstraints().get(3).setMaxWidth(cmbTwo.getWidth()));
    detailsGrid.widthProperty().addListener(e -> {
        detailsGrid.getColumnConstraints().get(1).setMaxWidth(Double.MAX_VALUE);
        detailsGrid.getColumnConstraints().get(3).setMaxWidth(Double.MAX_VALUE);
    });

我设置了我的两个组合框,在打开之前锁定列约束,然后当网格宽度改变时(通过调整大小),我允许它再次增加大小。

冯枫
2023-03-14

我只是玩弄了这个设置,看看我能想出什么。这似乎正在起作用。我在列中使用了百分比。

<VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="162.0" prefWidth="326.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
    <padding>
        <!--Insets bottom="30.0" left="30.0" right="30.0" top="30.0" /-->
    </padding>
   <children>
      <GridPane hgap="6.0" vgap="6.0" VBox.vgrow="SOMETIMES">
        <columnConstraints>
          <ColumnConstraints halignment="RIGHT" hgrow="NEVER" percentWidth="15.0" />
          <ColumnConstraints hgrow="SOMETIMES" percentWidth="35.0" />
            <ColumnConstraints halignment="RIGHT" hgrow="NEVER" percentWidth="15.0" />
            <ColumnConstraints hgrow="SOMETIMES" percentWidth="35.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Label text="Left 1" GridPane.halignment="RIGHT" />
            <Label text="Left 2" GridPane.halignment="RIGHT" GridPane.rowIndex="1" />
            <Label text="Left 3" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
            <Label text="Right 1" GridPane.columnIndex="2" GridPane.halignment="RIGHT" />
            <Label text="Right 2" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.rowIndex="1" />
            <Label text="Right 3" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="3" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="3" GridPane.rowIndex="2" />
         </children>
      </GridPane>
   </children>
</VBox>
 类似资料:
  • 问题内容: 嗨,我正在尝试使用ttk组合框创建带有options的下拉列表。这样做时,我可以配置传递给它的默认值的字体大小。但是,当我单击箭头时,其他值的字体大小保持不变。我正在为触摸屏开发应用程序,因此我需要提供适当的大小。这是示例代码,当我运行代码时,A的大小较大,单击箭头键上的按钮,我看到其他值都是默认大小。 问题答案: 问题是ttk组合框的下拉菜单实际上是一个简单的Tkinter列表框,因

  • 我使用blocking queue(LinkedBlockingQueue)在几个线程之间同步数据。请看下图。 主线程是一个生产者,它产生对象,然后将它们放入每个消费者的队列中(线程2-10)。需要强调的是,每个消费者都有自己的队列,每个产生的对象都将进入所有消费者的队列。 生产者的运行速度比使用者快得多,因此我们可以假设在使用者运行期间队列不应该为空。当任何使用者的队列达到其容量时,生产者将被阻

  • 我正在创建一个实现IAnimal接口的Animal类。然后,Cats和Dogs类都实现了IAnimal接口。目前,我在IAnimal中只保留了3个简单的方法,以便进行简短的演示。主要类动物是通过依赖注入(DI)构建的。 当IAnimal有更多的方法时,例如:Cats类只实现SomethingOnlyCatsDo方法,Dogs类实现SomethingOnlyDogsDo方法,那么每个类内部都会有更多

  • 问题内容: 我刚刚发现了CSS属性,它为我解决了一堆跨浏览器布局问题。 我现在唯一的问题是IE7似乎不支持它。是否有破解程序可以使IE7支持它? 问题答案: 我假设您正在使用它来解决IE6盒模型。不幸的是,实际上没有通用的方法可以诱骗早期版本的IE支持任意CSS属性。 我建议不要使用该属性,因为除IE6之外的所有浏览器都将正确实现box模型。在维基百科的文章做了解释如何IE6不同的一个好工作。 为

  • 问题内容: 在放入HashMap期间发生冲突时,是否会调整地图大小或将条目添加到该特定存储桶中的列表中? 问题答案: 当您说“冲突”时,您是指相同的哈希码吗?哈希码用于确定要使用HashMap中的哪个存储桶,并且该存储桶由具有相同哈希码的所有条目的链表组成。然后在返回或引导(获取/放入)之前比较条目的相等性(使用.equals())。 请注意,这是专门用于HashMap的(因为这是您所要求的),而

  • 我想让JFrame上的组件随着窗口的大小调整而调整大小。 这怎么能做到。 当前,当我使JFrame变小时,组件会保留在相同的位置,然后随着框架变小而消失。 理想情况下,我希望设置一个最小的JFrame大小,它不允许表单变小,但当我将其变大时,组件应该随JFrame移动。 补充:如果我想使用绝对布局管理器,该怎么办。这是我老板比较喜欢的布局经理。 代码: 公共类TestFrame扩展JFrame{p