这似乎不应该很难,但我无法弄清楚如何做到这一点:
我有一个JPanel
的子类。它有一个固定的高度,但可以是任何宽度。在构造上,子类使用setPreferredSize()
设置它们的首选大小,这意味着我必须提供除高度之外的宽度。
我想创建一个我的子类的一些滚动列表,其中子类都填充可用的水平空间。
现在我有一个滚动视图,其中包含一个包含我的子类的JPanel
。包含JPanel
的{{1}}使用垂直方向的BoxLayout
。
纵向看起来很棒。水平方向,我的自定义面板只是粘在首选尺寸。什么是使我的面板填充可用水平空间的最简单方法?我尝试为它们编写一些布局监听器,但性能很好(似乎有时会丢弃事件消息?)并且代码看起来很糟糕。其他视图(例如JList
,JTree
和滚动视图似乎会自动调整大小以填充BoxLayout
中的可用空间,因此我觉得必须有一些我可以做的事情我没有想过的JPanel
子类。
如果其他更适合的话,我愿意使用另一个布局管理器。我查看了GridBagLayout
,但这似乎更倾向于静态布局,其中组件未在运行时添加和删除。
编辑:我发现this on Oracle's Documentation for BoxLayout有一个看起来与我想要的完全相符的例子:
如果没有任何组件具有最大宽度,该怎么办?在这种情况下,如果所有组件具有相同的X对齐,则所有组件都与其容器一样宽。如果X对齐不同,则X对齐为0.0(左)或1.0(右)的任何组件都将更小。具有中间X对齐(例如中心)的所有组件将与其容器一样宽。以下是两个例子:
有人可以告诉我产生相同结果的代码吗?文档中的示例代码看起来并不像它覆盖了这个特定的图片。
答案 0 :(得分:0)
当您将组件放在JScrollPane
中时,您的组件可能会实现Scrollable
界面来调整滚动窗格的行为。通过这样做,您可以实现方法getScrollableTracksViewportWidth()
以返回true
,这样您的组件将始终具有可用宽度,并且只能在垂直方向上滚动。
JList
,JTable
,JTree
以及Swing的所有文字组件都是这样做的。
答案 1 :(得分:0)
好吧 - 我发现了问题。 getMinimumSize()
和getMaximumSize()
的默认实现似乎只会返回getPreferredSize()
的值(如果已设置)。因此,通过设置没有最大尺寸的首选尺寸,我的最大尺寸是首选尺寸。通过覆盖getMaximumSize()
返回(99999,preferredHeight),它现在可以正常工作。