2012-12-08 129 views
0

我需要實現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您的關注!

回答

1

引述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 –

相關問題