0

我正在尝试将 JList 添加到我的布局(2 列布局)。添加后,它会使其整个列占据父 JFrame 的整个宽度:

LwjglCanvas c = new LwjglCanvas(blah);
c.getCanvas().setMaximumSize(new Dimension(480, 800)); // explicit width

Box h = Box.createHorizontalBox();
h.add(c.getCanvas());
Box v = Box.createVerticalBox();
h.add(v);
JList list = new JList(mDefaultListModel); // plz use remainder width
v.add(list);

JFrame frame = new JFrame();
frame.setMinimumSize(new Dimension(800, 800));
frame.add(h);
frame.pack();
frame.setVisible(true);

因此,添加了 JList 后,右列将扩展到 JFrame 的整个宽度。我尝试将 JList 包装在 JScrollPane 中,但随后我的创建似乎挂起,并且布局从未完成。

这样做的正确方法是什么?

谢谢

- - - 更新 - - - - - - -

我给 JList 一堆 String 实例作为它的数据。字符串恰好很长。看起来正在发生的事情是 JList 正在使自己与它必须呈现的最长字符串一样宽,而忽略所有其他布局参数。理想情况下,它只会水平滚动,而不是增长到必要的最大可能宽度。

- - - 更新 - - - - - - -

终于搞清楚是怎么回事了。指定 JFrame 的大小似乎导致了这种行为。一旦我删除了该行,JList 就开始按预期呈现。将它包装在 JScrollPane 中,现在也可以使用。

4

1 回答 1

1

在布局中添加胶水。胶水将占据组件未使用的其余面板宽度。因此,将这行代码放在您想要占用面板中其余空间的位置:

h.add(Box.createHorizontalGlue());

此外,正如问题评论中所述,使用 BoxLayout 您不需要任何定位信息。所以你可以简单地使用这个:

h.add(someOtherPanel);

而不是这个:

h.add(someOtherPanel, BorderLayout.WEST);

于 2012-08-17T23:51:33.217 回答