java - JavaFX TableView 宽度从何而来?

标签 java user-interface javafx tableview

看起来 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:

  1. 开发人员明确设置它们(例如 setPrefWidth(400))。
  2. 它们设置为 Region.USE_COMPUTED_SIZE (即-1.0)2
  3. 它们设置为 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))是获取最小、首选和最大尺寸的“入口点”一个节点。但是,minprefmax 属性不是通用的(适用于 Region 以及范围、WebView)和 computeXXX 方法是 Parent(及其子类)所独有的。其他类型的Node(例如Shape)提供了自己的内部机制。

此外,首选尺寸仅供引用。父级可以自由地调整其子级的大小,因为它认为适合最小值和最大值的约束。如果您想知道节点最终的尺寸是多少,可以使用 Region.widthRegion.height 属性(当使用 Region)或 Node.boundsInLocal 属性(对于任意 Node)。 WebView 和一些 Shape 实现还提供了用于了解其尺寸的属性。

<小时/>

注意:

这个答案重点关注节点(即场景图)。正如 kleopatra 所指出的,具有 prefWidth 等属性的其他对象(例如 TableColumnBase)不具有与 Region 相同的指定行为。例如,将值设置为 -1 并未定义为具有相同的行为方式。这也适用于 WebView,虽然它具有 min/pref/max 维度属性,但不是 Region

TableView 的默认外观实现在计算其首选宽度时会考虑每个可见 TableColumnprefWidth

关于java - JavaFX TableView 宽度从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56508235/

相关文章:

java - 在浏览器中打开时,S3 对象 url 不安全(ssl)

java - 替换 If 语句?

java - 如何自定义或更改 Jenkins Web GUI(主题)?

objective-c - 在 iPhone 应用程序中创建锁定 slider 克隆

java - PDFBox:处理非常大的 PDF。

java - 使用 ChromeDriver 设置 browsermob 代理

java - 我需要在添加新组件时动态调整 JPanel 的大小

java - Netbeans 中 Scene Builder 的配置错误

java - 有没有办法让 javaFX 图表中的特定数据始终具有相同的颜色?

JavaFX EXCEPTION_ACCESS_VIOLATION