Почему установка предпочтительного размера Double.POSITIVE_INFINITY или Double.MAX_VALUE не работает в JavaFX, в то время как 10000 работает? - PullRequest
0 голосов
/ 25 января 2019

По какой-то странной причине, если я пытаюсь установить высоту HBox с помощью

setPrefHeight(10000)

, он творит чудеса (он пытается заполнить как можно больше места физически), пытаясь при этом любой изследующие (более очевидные) опции сводят макет с ума:

setPrefHeight(Double.POSITIVE_INFINITY);
setPrefHeight(Double.MAX_VALUE);

Я также пытался поиграть с setMaxHeight(), но это не очень помогло (результатыв конечном итоге был тем же самым).Это не HBox специфическое поведение, так как я видел, что это происходит и с другими видами элементов управления.

Что здесь происходит?

1 Ответ

0 голосов
/ 26 января 2019

В зависимости от ожидаемой детализации ответа на этот вопрос причина может быть простой:

Он превысит все пределы и больше не допустит разумных вычислений.

Когда класс отвечает за компоновку и должен разместить два компонента в двух столбцах, он может просто что-то сделать примерно следующим образом:

void layout() {
    double widthA = componentA.getPrefWidth();
    double widthB = componentB.getPrefWidth();
    double widthRequired = widthA + widthB;
    double widthAvailable = ...;
    double scaling = widthAvailable / widthRequired;
    componentA.setWidth(scaling * widthA);
    componentB.setWidth(scaling * widthB);
}

(Это, конечно, какой-то "псевдокод". Реальность гораздо сложнее)

Очевидно, что все эти вычисления сойдут с ума при обнаружении значений, которые вы предложили. Добавление чего-либо к Double.MAX_VALUE приведет к переходу на POSITIVE_INFINITY:

double w0 = Double.MAX_VALUE;
double w1 = 1000;
System.out.println(w0 + w1); // Prints Infinity

А бесконечность - "вирусная". Это испортит все дальнейшие вычисления:

double i0 = Double.POSITIVE_INFINITY;
double i1 = 1000;
System.out.println(i0 - i1); // Prints Infinity

В некоторых местах JavaFX существуют «магические ценности». Например, предпочтительные размеры null или -1.0 приведут к тому, что предпочтительный размер будет вычислен на лету. Они могут также решили присвоить специальное значение MAX_VALUE или POSITIVE_INFINITY или сделать все вычисления макета независимыми от этих специальных значений ... каким-то образом. Но учитывая, насколько сложными могут быть вычисления компоновки, это, вероятно, было бы просто неудобством для реализации, если бы она вообще могла быть реализована разумно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...