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

时间:2019-01-25 20:58:23

标签: java javafx

出于某些奇怪的原因,如果我尝试用{p>设置HBox的高度

setPrefHeight(10000)

它能产生奇迹(它试图填充尽可能多的空间),同时尝试以下任何(更明显的)选项会使布局变得疯狂:

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

我也尝试过使用setMaxHeight(),但这似乎并没有太大帮助(结果最终还是一样)。这不是HBox的特定行为,正如我所看到的,它也在其他类型的控件中发生。

这是怎么回事?

1 个答案:

答案 0 :(得分:2)

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

它将超出所有限制,并且不再允许进行明智的计算。

当一个类负责布局,并且应该在两列中布置两个组件时,它可能只是做大致这样的事情:

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_VALUEPOSITIVE_INFINITY赋予特殊含义,或者使所有布局计算都与这些特殊值无关。但是考虑到布局计算可能变得多么复杂,如果可以完全合理地实现,那么这可能只是一个讨厌的实现...