看起来 TableView
有一些默认宽度,与列内容无关(更不用说屏幕上的高度和位置,这些也会受到将其用作根的影响 Scene
而不是例如 StackPane)。
我知道每个JavaFX元素都有它的首选大小,并且场景正在调整它,但我想知道在哪里这个>来自?我尝试在 TableView
文档中找到它并使用 getters 获取它的宽度,但没有成功。
我知道我可以明确设置舞台宽度和高度,但这不是我感兴趣的。
在此示例中,您可以观察窗口的大小(和位置)如何变化,具体取决于其内容。
@Override
public void start(Stage stage) throws IOException, URISyntaxException {
TableView table = createTable();
StackPane pane = new StackPane();
Scene scene = new Scene(table);
// Scene scene = new Scene(pane);
stage.setScene(scene);
stage.show();
}
最佳答案
当涉及 Region
的最小、首选和最大尺寸时,共有三种不同的模式1:
- 开发人员明确设置它们(例如
setPrefWidth(400)
)。 - 它们设置为
Region.USE_COMPUTED_SIZE
(即-1.0
)2。 - 它们设置为
Region.USE_PREF_SIZE
(即负无穷大)1。
1。首选尺寸只有两种模式,因为 USE_PREF_SIZE
仅对最小和最大尺寸有意义。
2.这是 Region
及其大多数(全部?)子类的默认设置。
当尺寸设置为USE_COMPUTED_SIZE
时,这意味着在布局期间使用 protected 方法计算值,例如:
以及最小和最大尺寸的类似方法。
但是,当涉及到Control
时,这些计算通常委托(delegate)给外观类。大多数皮肤实现继承自 SkinBase
它提供了类似的方法来计算最小/首选/最大尺寸;它们具有相同的名称,但接受更多参数以使计算更容易一些。您在 a comment 中注明在 TableView
的情况下,首选宽度和高度的计算发生在 TableViewSkinBase
中.
您可能想知道如何获得这个计算值;我不相信你能以可靠的方式做到这一点。您可以尝试使用Node
的公共(public)方法,例如 Node.prefWidth(double)
,但问题是知道要传递什么值作为参数。如果该值不应该是-1
,那么实际上只有父级才能确定有多少可用空间。
注意:Node
的这些方法(例如 prefWidth(double)
)是获取最小、首选和最大尺寸的“入口点”一个节点
。但是,min
、pref
和 max
属性不是通用的(适用于 Region
以及范围、WebView
)和 computeXXX
方法是 Parent
(及其子类)所独有的。其他类型的Node
(例如Shape
)提供了自己的内部机制。
此外,首选尺寸仅供引用。父级可以自由地调整其子级的大小,因为它认为适合最小值和最大值的约束。如果您想知道节点最终的尺寸是多少,可以使用 Region.width
和 Region.height
属性(当使用 Region
)或 Node.boundsInLocal
属性(对于任意 Node
)。 WebView
和一些 Shape
实现还提供了用于了解其尺寸的属性。
注意:
这个答案重点关注节点
(即场景图)。正如 kleopatra 所指出的,具有 prefWidth
等属性的其他对象(例如 TableColumnBase
)不具有与 Region
相同的指定行为。例如,将值设置为 -1
并未定义为具有相同的行为方式。这也适用于 WebView
,虽然它具有 min/pref/max 维度属性,但不是 Region
。
TableView
的默认外观实现在计算其首选宽度时会考虑每个可见 TableColumn
的 prefWidth
。
关于java - JavaFX TableView 宽度从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56508235/