【问题标题】:List of contacts swing联系人列表
【发布时间】:2012-12-08 11:56:22
【问题描述】:

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

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

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

如果对contactPanel 使用FlowLayout(请参见图片中的FlowLayout)

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

如果使用 Grid 或 Box 布局。布局会自动重新调整我的面板大小,看起来很丑。请参阅 Grid&Box 布局图片。

预期结果见“预期”图像

----SEE IMAGE----

我不是母语,所以请原谅我的英语不好。感谢您的关注!

【问题讨论】:

    标签: java swing jscrollpane


    【解决方案1】:

    引用Swing tutorial:

    FlowLayout 类将组件排成一行,并按其首选大小调整大小。如果容器中的水平空间太小,无法将所有组件放在一行,FlowLayout类使用多行

    所以你得到的结果是预期的。

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

    所以你得到的结果也是意料之中的。

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

    所以你得到的结果也是意料之中的。

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

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

    【讨论】:

    • 好的。谢谢。我这样做了:public void refreshContactsList(Set<IContact> contacts) { contactPanel.removeAll(); Box contactsBox = Box.createVerticalBox(); for (IContact contact : contacts) { JContact jContact = new JContact(mediator, contact); contactsBox.add(jContact); contactsBox.add(Box.createVerticalGlue());} contactPanel.add(contactsBox); contactPanel.revalidate(); contactPanel.repaint();} 但得到的结果与使用网格布局的情况相同。
    • 您在每次接触后添加胶水。您应该只在最后一个之后添加胶水。
    • 另一个问题是您可能没有定义 JContact 组件的最大高度。这是一个工作示例:gist.github.com/4240355
    • 那么你应该接受答案。阅读meta.stackexchange.com/a/5235/188717
    • 好的,我知道这一点,但不能因为没有足够的投票率。
    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2010-12-26
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多