出于某些奇怪的原因,如果我尝试设置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_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
赋予特殊含义,或者使所有布局计算均不知道这些特殊值……以某种方式。但是考虑到布局计算可能变得多么复杂,如果可以合理地实现,这可能只是一个讨厌的实现...