为什么将首选大小设置为Double.POSITIVE_INFINITY或Double.MAX_值在JavaFX中不起作用,而10000起作用?

为什么将首选大小设置为Double.POSITIVE_INFINITY或Double.MAX_值在JavaFX中不起作用,而10000起作用?,java,javafx,Java,Javafx,出于某种奇怪的原因,如果我试图用 setPrefHeight(10000) 它创造了奇迹(它试图在物理上填充尽可能多的空间),而尝试以下任何一个(更明显的)选项都会使布局变得疯狂: setPrefHeight(Double.POSITIVE_INFINITY); setPrefHeight(Double.MAX_VALUE); 我也尝试过使用setMaxHeight(),但似乎没有多大帮助(结果完全一样)。这不是HBox的特定行为,我在其他类型的控件中也看到过这种情况 这里发生了什么?根据这

出于某种奇怪的原因,如果我试图用

setPrefHeight(10000)
它创造了奇迹(它试图在物理上填充尽可能多的空间),而尝试以下任何一个(更明显的)选项都会使布局变得疯狂:

setPrefHeight(Double.POSITIVE_INFINITY);
setPrefHeight(Double.MAX_VALUE);
我也尝试过使用
setMaxHeight()
,但似乎没有多大帮助(结果完全一样)。这不是HBox的特定行为,我在其他类型的控件中也看到过这种情况


这里发生了什么?

根据这个问题答案的预期细节,原因可能很简单:

它将超出所有限制,不再允许进行合理的计算

如果一个类负责布局,并且应该在两列中布局两个组件,那么它可能只做一些大致如下的事情:

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\u值添加任何内容将使其变为
正无穷大

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
的首选大小将导致动态计算首选大小。他们还可以决定赋予
最大值
正无穷大
一个特殊的含义,或者使所有布局计算与这些特殊值无关。。。以某种方式但考虑到布局计算可能会变得多么复杂,这可能会对实施造成麻烦,如果能够合理实施的话…

根据该问题答案的预期细节,原因可能很简单:

它将超出所有限制,不再允许进行合理的计算

如果一个类负责布局,并且应该在两列中布局两个组件,那么它可能只做一些大致如下的事情:

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\u值添加任何内容将使其变为
正无穷大

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
的首选大小将导致动态计算首选大小。他们还可以决定赋予
最大值
正无穷大
一个特殊的含义,或者使所有布局计算与这些特殊值无关。。。以某种方式但是考虑到布局计算可能会变得多么复杂,如果能够合理地实现,这可能会对实现造成麻烦…

你能发布一个MCVE来演示这个问题吗?另外,你可以发布你正在使用的Java/JavaFX版本吗?我会给你一个MCVE。我正在运行JDK10附带的JavaFX。我回家后可以给你更多的细节。你能发布一个演示问题的MCVE吗?另外,你可以发布你正在使用的Java/JavaFX版本吗?我会给你一个MCVE。我正在运行JDK10附带的JavaFX。我回家后可以给你更多的细节。