如何在Java BoxLayout中消除空格?

5kgi1eie  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(146)

我编程如下ListPanel

使用Java BoxLayout

public class ListPanel extends JPanel {
private ArrayList<EntryHolder> entries;

public ListPanel(){
    entries = new ArrayList<>();
    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    updatePanel();
}

public void updatePanel() {
    removeAll();

    synchronized (entries) {
        for (EntryHolder entryHolder : entries) {
            EntryPanel entryPanel = new EntryPanel(entryHolder);
            entryPanel.setPreferredSize(new Dimension(getPreferredSize().width, 50));
            add(entryPanel);
        }
    }
}

public void addEntry(EntryHolder entryHolder) {
    synchronized (entries) {
        entries.add(entryHolder);
    }
}

public void clearEntries() {
    synchronized (entries) {
        entries.clear();
        }
    }
}

ListPanel是允许滚动的JScrollPane的一部分。EntryPanel是由两个其他JPanels组成的JPanel:一个始终可见,另一个仅在单击第一个时可见。在我运行add()函数之前,隐藏的是setVisible(false)。EntryPanel使用BorderLayout:

add(shownEntryPanel, BorderLayout.NORTH);
add(hiddenEntryPanel, BorderLayout.CENTER);

当有足够的条目填充整个ListPanel时,这种方法对我的滚动列表非常有效,但是一旦条目变少,EntryPanels之间就会出现白色:

我尝试了很多不同的布局,但我找不到一个做正是我想要的:从上到下定位面板,没有空格,但仍然有能力自由扩展条目。我知道MigLayout是一个选项,但我不想使用任何额外的库。

igsr9ssn

igsr9ssn1#

当面板中有额外的空间时,BoxLayout将尝试将该空间分配给面板中的每个组件,最大分配到组件的最大大小。
面板的最大大小为Integer.MAX_VALUE。
重写EntryPanel的getMaximumSize()方法。
比如:

@Override
public Dimension getMaximumSize()
{
    Dimension preferred = getPreferredSize();
    Dimension maximum = new Dimension(Integer.MAX_VALUE, preferred.getHeight());
 
    return maximum;
}

这将防止为EntryPanel分配额外的空间,因此不会出现间隙。
另一个解决方案是使用“ Package ”面板:

JPanel boxLayoutPanel = new JPanel(...)
JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(boxLayoutPanel, BorderLayout.PAGE_START);
parentPanel.add(wrapper);

BorderLayoutPAGE_START区域考虑组件的高度,因此所有组件都以其首选高度显示,并且组件之间不会出现间隙。

ffscu2ro

ffscu2ro2#

此处的解决方案是在面板上添加一个 glue。在本例中为最后一个组件。Oracle文档中对 glue 的描述如下:
粘合-使用此选项可指定布局中多余空间的放置位置。可将其视为一种弹性粘合剂-可拉伸和扩展,但不会占用空间,除非您将其所粘附的组件拉开。例如,通过在从左到右的框中的两个组件之间放置水平粘合剂,您可以在这些组件之间放置任何多余空间,而不是在所有组件的右侧放置。

相关问题