JavaFX: ComboBox в GridPane вызывает ненужное изменение размера

У меня GridPane с 5 столбцами. Это мои hgrow настройки для ограничений столбца соответственно.

  1. SOMETIMES
  2. ALWAYS
  3. SOMETIMES (фиксированный размер)
  4. SOMETIMES
  5. ALWAYS

Вся GridPane в основном представляет собой макет для формы с двумя столбцами. Мои столбцы 1 и 4 (индекс 0 и 3) - это метки полей, а столбцы 2 и 5 - поля ввода (TextField и т. Д.). Столбец 3 - это просто заполнение фиксированной ширины между двумя столбцами формы.

У меня есть несколько ComboBox в моей форме - некоторые в левом столбце, некоторые в правом столбце. Я установил максимальную ширину всех ComboBox на MAX_VALUE.

Когда форма загружается, макет выглядит так, как я задумал (оба столбца поля ввода имеют одинаковую ширину). Однако, когда я нажимаю на любой из ComboBox, это приведет к увеличению ширины столбца, в котором был нажат ComboBox, что приведет к уменьшению другого столбца поля ввода на такую ​​же величину.

Я могу попеременно нажимать ComboBox слева и справа, и ширина обоих столбцов будет постоянно меняться. Изменение будет становиться все меньше и меньше, и в конечном итоге столбцы перестанут изменять размер. Конечным результатом является то, что два столбца не равны по ширине.

У меня такая же проблема с другим JFXDatePicker элементом управления из библиотеки JFoenix.

Еще одно ограничение, которое у меня есть, заключается в том, что эта форма находится в пределах 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 и дал бы ему абсолютную позицию), и проблемы бы не было.

Обе метки должны быть всегда видимы (если только весь GridPane не уменьшен до ужасно маленького размера), и любое дополнительное пространство должно быть предоставлено элементам управления вводом (TextField, ComboBox и т. Д.). Точно так же, если GridPane уменьшается, я ожидаю, что столбцы ввода будут сокращаться вместо столбцов меток. Столбцы меток должны сохранять фиксированный размер повсюду, и этот размер является минимальным размером, необходимым для отображения всех меток без появления многоточия.

Поскольку окончательная форма содержит смесь различных элементов управления вводом, ComboBox будет выглядеть странно, если ее размер не будет изменен до такой же ширины, как у других элементов управления вводом в том же столбце. Допускаю, что к этому требованию я придираюсь.

Я также ожидаю, что оба столбца ввода будут иметь одинаковую ширину, и это должно всегда оставаться верным.

Еще одно обновление

Я сделал отчет об ошибке по этому поводу, и он все еще открыть с приоритетом P3.


person Jai    schedule 11.05.2017    source источник


Ответы (2)


Я просто поигрался с настройкой, чтобы посмотреть, что я могу придумать. Кажется, это работает. Я использовал проценты в столбцах.

<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>
person Sedrick    schedule 23.05.2017
comment
Конечно, это предотвратит случайное изменение ширины двух столбцов со списком со списком, но ширина столбцов с метками масштабируется, чего я не хочу видеть. Мне нужно, чтобы столбцы меток были достаточно широкими, чтобы вместить все метки. - person Jai; 24.05.2017

Это довольно старый пост, но я только что столкнулся с этой проблемой и обнаружил, что лучший способ сделать это - динамически добавлять обработчики ширины как в ComboBox, так и в GridPane, у меня есть сетка 4 x 2 с меткой / комбо / меткой / combo очень похоже на вас:

    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);
    });

Я настраиваю два поля со списком, чтобы заблокировать ColumnConstraint перед открытием, а затем, когда ширина сетки изменяется (путем изменения размера), я снова разрешаю ей увеличивать размер.

person kendavidson    schedule 10.08.2017