Java Swing - 填充可用空间的动态列表?

时间:2013-11-28 19:35:07

标签: java swing layout-manager

这似乎不应该很难,但我无法弄清楚如何做到这一点:

我有一个JPanel的子类。它有一个固定的高度,但可以是任何宽度。在构造上,子类使用setPreferredSize()设置它们的首选大小,这意味着我必须提供除高度之外的宽度。

我想创建一个我的子类的一些滚动列表,其中子类都填充可用的水平空间。

现在我有一个滚动视图,其中包含一个包含我的子类的JPanel。包含JPanel的{​​{1}}使用垂直方向的BoxLayout

纵向看起来很棒。水平方向,我的自定义面板只是粘在首选尺寸。什么是使我的面板填充可用水平空间的最简单方法?我尝试为它们编写一些布局监听器,但性能很好(似乎有时会丢弃事件消息?)并且代码看起来很糟糕。其他视图(例如JListJTree和滚动视图似乎会自动调整大小以填充BoxLayout中的可用空间,因此我觉得必须有一些我可以做的事情我没有想过的JPanel子类。

如果其他更适合的话,我愿意使用另一个布局管理器。我查看了GridBagLayout,但这似乎更倾向于静态布局,其中组件未在运行时添加和删除。

编辑:我发现this on Oracle's Documentation for BoxLayout有一个看起来与我想要的完全相符的例子:

  

如果没有任何组件具有最大宽度,该怎么办?在这种情况下,如果所有组件具有相同的X对齐,则所有组件都与其容器一样宽。如果X对齐不同,则X对齐为0.0(左)或1.0(右)的任何组件都将更小。具有中间X对齐(例如中心)的所有组件将与其容器一样宽。以下是两个例子:

     

Image Showing What I Want

有人可以告诉我产生相同结果的代码吗?文档中的示例代码看起来并不像它覆盖了这个特定的图片。

2 个答案:

答案 0 :(得分:0)

当您将组件放在JScrollPane中时,您的组件可能会实现Scrollable界面来调整滚动窗格的行为。通过这样做,您可以实现方法getScrollableTracksViewportWidth()以返回true,这样您的组件将始终具有可用宽度,并且只能在垂直方向上滚动。

JListJTableJTree以及Swing的所有文字组件都是这样做的。

答案 1 :(得分:0)

好吧 - 我发现了问题。 getMinimumSize()getMaximumSize()的默认实现似乎只会返回getPreferredSize()的值(如果已设置)。因此,通过设置没有最大尺寸的首选尺寸,我的最大尺寸是首选尺寸。通过覆盖getMaximumSize()返回(99999,preferredHeight),它现在可以正常工作。