JList太宽了?

时间:2012-08-17 21:58:10

标签: java swing

我正在尝试将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中,现在也可以使用。

1 个答案:

答案 0 :(得分:1)

在布局中添加胶水。胶水将占用组件未使用的面板宽度的其余部分。所以把这行代码放在你想占用面板其余部分的地方:

h.add(Box.createHorizontalGlue());

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

h.add(someOtherPanel);

而不是:

h.add(someOtherPanel, BorderLayout.WEST);