【问题标题】:How to limit javafx TableView Size to the Size necessary?如何将 javafx TableView 大小限制为必要的大小?
【发布时间】:2015-02-13 15:21:47
【问题描述】:

我正在编写一个简单的 Questionare 应用程序。我在自定义 javaFX 组件(代表一个问题)中使用 TableView,它用作 ListView 中的 ListCell(用于代表整个问卷)。

我想要什么:每个 ListCell 使用尽可能少的空间(或必要的),同时仍然显示其全部内容。

会发生什么:TableView 似乎默认为标准大小。如果 Table 有更多内容,它会在 ScrollPane 中显示其内容。如果 TableView 的内容较少,它会用空白空间填充自己。


我尝试通过多种方式解决我的问题:

  1. 最初我认为一定有办法停用滚动条。但我找不到任何方法。

  2. 然后我尝试通过更改 PreferredSizeProperty 来更改表格的大小: table.setPrefHeight() 但我找不到任何关于桌子有多大的信息。 table.setPrefHeight(USE_COMPUTED_SIZE); 没有得到我想要的结果。

  3. 然后我尝试自己计算必要的高度,但我找不到任何方法来确定各个行的高度。在自定义 TableCell 的更新方法中调用 this.getTableRow().getHeight() 将导致 NullPointerExceptions。当检查 null 时,它仍然会返回 0! TableRow<T> tr = this.getTableRow(); if (tr != null) { System.out.println(tr.getHeight()); }

  4. 非常沮丧,我决定通过调用来修复行高 table.setFixedCellSize(20); 这严重限制了自定义 TableCells 的点,但我没有取得任何进展。但是,表格高度也不等于行数乘以固定的行高,因为需要考虑表格标题。而且我无法访问表格标题或询问表格标题的大小/高度。

您对我出错的地方有什么建议,或者我为实现最初的目标而忽略了什么(有一个非常大的 ListCell 来显示表格的每一行,但不是一个空行?)任何帮助/想法都将受到欢迎!谢谢!

【问题讨论】:

  • 所以你已经把这个挤在一起了:ListView -> ListCell -> TableView?这在很多层面上都是错误的。我不知道从哪里开始。我强烈建议您使用不同的组件重写 UI。 ListView 和 TableView 都旨在显示大量数据,从而以虚拟化的方式布局其子项(单元格)。这并不意味着将包含 TableView 的单个问题显示为 ListCell 图形。
  • 一个问题被一个使用 TableView 作为子组件的自定义组件压制。每个问题本身就是一个 ListCell,要显示在 ListView 中。就我而言,TableView 并不大:它可能包含 1 到 10 行的任何内容。我同意:就一行而言,这似乎毫无意义,但如果需要几行,我还没有看到它有什么问题。
  • 您想要做的事情将非常困难(如果可能的话)。 TableView 不应该用于布局,这实际上是您在这里尝试做的。您是否真的需要表格视图的任何功能(可调整大小的列、可拖动的列、标题单击排序等)?如果不是,最好使用布局窗格(例如GridPane)来显示单元格而不是TableView
  • 如果不可能,显然我必须使用另一种解决方案。但是,我要求用户提供列表,例如对于多个日期:“列出您之前 5 次约会的日期”或“列出您之前居住超过一个月的所有地址以及您在那里居住的时间”。而且我认为输入此类数据的表格将是一个非常明显的选择。

标签: java listview javafx tableview tablecell


【解决方案1】:

看看:

tableView.setColumnResizePolicy(..);

也许这对你有帮助

【讨论】:

    【解决方案2】:

    使用 Bindings(示例有一个至少有 2 行的表格视图,或者一个具有列表中所有项目大小的表格......

    /**
     * Helper to set table height based on content 
     *
     * @param table        - the table in context
     * @param rowHeight    - the height of a single row, alternatively could use table.fixedCellSizeProperty()
     * @param headerHeight - the height of the table header
     * @param margin       - a value for the margins
     */
    public void tableHeightHelper(TableView<?> table, int rowHeight, int headerHeight, int margin) {
        table.prefHeightProperty().bind(Bindings.max(2, Bindings.size(table.getItems()))
                                                .multiply(rowHeight)
                                                .add(headerHeight)
                                                .add(margin));
        table.minHeightProperty().bind(table.prefHeightProperty());
        table.maxHeightProperty().bind(table.prefHeightProperty());
    }
    

    如果列表上有一个监听器或订阅,则表的大小将始终根据项目进行调整

    这实际上取决于您如何为列表视图自定义单元格,以及您如何配置单元格工厂...只要未设置 ListView 中的 fixedCellProperty(),我就没有ListView 中单个单元格的问题,调整为它们包含的节点的大小。

    【讨论】:

    • 什么时候调用这个函数,为什么?
    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2014-10-31
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多