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

标签 java javafx

出于某种奇怪的原因,如果我尝试使用设置 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_VALUEPOSITIVE_INFINITY分配特殊含义,或者使所有布局计算与这些特殊值无关。 。 不知何故。但考虑到布局计算可能变得多么复杂,如果可以合理地实现的话,这可能会给实现带来麻烦......

关于java - 为什么将首选大小设置为 Double.POSITIVE_INFINITY 或 Double.MAX_VALUE 在 JavaFX 中不起作用,而 10000 却可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54372676/

相关文章:

java - 使用 javac 进行 Ant 编译未找到主类

JavaFX打印自定义纸张尺寸

java - 线程“AWT-EventQueue-0”中的异常java.lang.NullPointerException登录表单错误

java - 包含在 Android : findViewById returns null

Java8 Stream List<Map<String,Object>> 分组依据和计数值

java - Scala 和 Gosu(与 Java 相关)之间的本质异同是什么?

java - 如何在运行时设置窗口大小?

java - 在 Java fxml 应用程序中为动态创建的 Text 对象应用鼠标单击监听器

java - 为什么 JavaFX TableView 不显示数据?

java - 我如何模拟 JWT.decode?