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