我有一个带有自定义单元工厂的 ListView。我计算单元格的最大值 minWidth 并将其设置为整个 ListView 的 minWidth。因此,受布局中其他区域约束的 ListView 会精确地缩小到 minWidth。但它所容纳的单元格的大小会调整为首选宽度,而不是最小宽度。因此,节点不适合包含视口,并且会显示水平滚动条。
太恶心了。我想让每个单元格完全适合 ListView,并摆脱滚动条。更确切。当 ListView 减小到其最小宽度时,其所有单元格也应减小到该最小宽度。
我正在寻找一些控制属性来切换单元格大小调整策略,以便在没有预定义开关的情况下实现所描述的行为。
更新:添加了图形示例
我创建了 SplitPane 来简化测试布局。我可以通过用鼠标移动其分隔符来定义布局限制。
第一张照片显示了最初的问题:不考虑单元节点的实际尺寸(最小、最大、首选)。 ListView 始终使用 prefWidth,即使它大于视口宽度。因此,当可以避免水平滚动时,就使用水平滚动。
之后我尝试手动将首选宽度设置得更小。所以单元格现在完全可见。这不是解决方案。我给出这个镜头是为了证明单元格的 minWidth 足够小以适合 ListView。
最后一张也太丑了它留下了可以填充单元格内容的自由空间。这是很自然的:如果视口大于首选宽度并小于最大宽度,则应将其用于调整单元格内容的大小。
通过切换到显式指定的元素的静态大小可以抑制该问题。但这样做意味着放弃动态布局的所有好处:每次使用 CSS 应用新皮肤时,程序员都必须更改大小常量,并且用户将被禁止使用鼠标调整窗口大小或移动分隔符。
这也是一个糟糕的解决方案。我需要什么 - 使 javafx 的布局引擎工作。 ListView 的最小宽度应该是其单元格的最大最小宽度。 ListView 的最大宽度应为其单元格的最小最大宽度。 ListView 的首选宽度应该是其单元格的最大首选宽度。 ListView 的实际宽度应由其父级(本例中的 SplitPane)相对于所有三个布局边界进行设置。之后这个大小应该传递给单元格。
仅当某些单元格最小宽度太大而无法适应视口时,才应显示水平滚动条。