Как получить фактический размер дочерних элементов при вычислении макета в JavaFX? - PullRequest
0 голосов
/ 23 мая 2018

Я только начал изучать JavaFX для создания настольных приложений, и в настоящее время у меня пока нет личного обучения.Прямо сейчас относительно вопроса, я пытаюсь сделать пользовательский макет, который зависит от его размера от общего размера его дочерних элементов.Моя проблема заключается в получении размера каждого ребенка при вычислении высоты и ширины.Здесь я использую метод getLayoutBounds() для получения размера детей, но он всегда возвращает 0 в моем случае:

@Override
protected double computePrefWidth(double height) {
  for (int i = 0; i < getChildren().size(); i++) {
    Node node = getChildren().get(i);
    System.out.println(node.getLayoutBounds().getWidth()); // returns 0
  }
}

Так что я предполагаю, что речь идет о проходе макета (скажем, ребенок еще не выложен).Но в любом случае, если это так или нет, как я могу получить точный размер узла, включая вставки, отступы и т. Д.?Спасибо за все ответы.


ОБНОВЛЕНИЕ

В итоге я использую метод prefWidth() и prefHeight(), который является правильным ответом.Это моя ошибка в использовании метода getWidth() и getHeight(), так как я думал, что метод prefWidth() не включает отступы / вставки.С другой стороны, getWidth() фактически полагается на проход макета *1020*, что означает, что он возвращает 0, потому что узлы (дочерние элементы) еще не разложены на стадии, что является ответом @ ᴇʟᴇvᴀтᴇ нижеэто правильно.

Так что ради других, кто сталкивался с этим, вы можете прочитать этот один и, наконец, убедиться, что все таблицы стилей CSS правильно применяются, если вы не получаетеожидаемый результат при использовании методов pref, min, max (см. ответы по @fabian и @SilasGyeme ниже).

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Установите setPrefWidth дочерних элементов, затем получите доступ к ним, используя getPrefWidth

0 голосов
/ 23 мая 2018

Если вы реализуете пользовательский Region (или косвенный подкласс), задача ваших классов - определить размер дочерних элементов.

computePrefWidth ect.нужно учитывать границы размера дочерних элементов и определять его собственный предпочтительный размер на основе этих значений.Для этих видов расчетов вы должны использовать minWidth, minHeight, prefWidth, prefHeight, maxWidth и maxHeight методы Node.

Пример

@Override
protected double computePrefWidth(double height) {
    double size = 0;
    for (Node child : getManagedChildren()) {
        double pW = child.prefWidth(height);
        if (pW > size) {
            size = pW;
        }
    }

    // TODO: consider insets ect...
    return size;
}

Приведенный выше способ определения размера префа будетподходит, например, для чего-то вроде VBox.

0 голосов
/ 23 мая 2018

getWidth() возвращает 0, пока вы не покажете сцену и не разметите узлы.После этого они будут иметь ненулевую ширину.

Используйте runLater() для запуска действий после макета.

Platform.runLater(() -> {
    // TODO: Calculations based on laid out sizes
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...