联系人列表swing

问题描述:

我需要实现ui的联系人列表,如在Skype中。由来自JPanel的自定义类(JContact)表示的联系人。我试图使用不同的布局,但没有收到预期的结果。主框架具有下一个结构。联系人列表swing

的JFrame - >的JPanel(contactsPanel) - > JScrollPane的(scrollContacts) - >的JPanel(contactPanel)

scrollContacts.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_​​ALWAYS); scrollContacts.setHorizo​​ntalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_​​NEVER);

如果使用的FlowLayout为contactPanel(见的FlowLayout图像)

奇怪的行为,我认为,因为预期的每个联系人将一个一个下,因为指示HORIZONTAL_SCROLLBAR_​​NEVER为scrollContacts。

如果使用Grid或Box布局。布局自动重新调整我的面板的大小,它看起来非常难看。请参阅Grid & Box layouts图像。

预期结果看到“预期”的形象

----SEE IMAGE----

我不是母语的人,所以请对不起,是我不好English.Thank您的关注!

引述Swing tutorial

的的FlowLayout类放部件成一排,在其优选的大小尺寸。如果容器中的水平空间太小而无法将所有组件放在一行中,FlowLayout类将使用多行

因此,您所得到的结果是预期的。

GridLayout对象将组件放置在单元格网格中。每个组件占用其单元中的所有可用空间,并且每个单元的大小完全相同。如果GridLayoutDemo窗口的大小已调整,则GridLayout对象将更改单元格大小,以便在给容器提供可用空间的情况下单元格尽可能大。

所以你也得到了结果。

当BoxLayout从上到下布局组件时,它会尝试调整组件的首选高度处的每个组件的尺寸。如果布局的垂直空间不匹配首选高度的总和,则BoxLayout会尝试调整组件的大小以填充空间。

所以你也得到了结果。

但是,盒子布局可以包含胶水组件以避免这种情况。

因此,我会使用垂直框布局,并添加一个垂直胶作为最后一个组件。阅读the tutorial

+0

好的。感谢名单。我这样做: 'public void refreshContactsList(Set contacts){ contactPanel.removeAll(); Box contactsBox = Box.createVerticalBox(); (联系人联系人){ JContact jContact = new JContact(mediator,contact); contactsBox.add(jContact); contactsBox.add(Box.createVerticalGlue());} contactPanel.add(contactsBox); contactPanel.revalidate(); contactPanel.repaint();}' 但是得到了与网格布局相同的结果。 – dmgcodevil

+0

您在每次联系后添加胶水。你应该只在最后一个之后添加胶水。 –

+0

另一个问题是您可能没有定义JContact组件的最大高度。这是一个工作示例:https://gist.github.com/4240355 –