我编程如下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是一个选项,但我不想使用任何额外的库。
2条答案
按热度按时间igsr9ssn1#
当面板中有额外的空间时,BoxLayout将尝试将该空间分配给面板中的每个组件,最大分配到组件的最大大小。
面板的最大大小为Integer.MAX_VALUE。
重写EntryPanel的
getMaximumSize()
方法。比如:
这将防止为EntryPanel分配额外的空间,因此不会出现间隙。
另一个解决方案是使用“ Package ”面板:
BorderLayout
的PAGE_START
区域考虑组件的高度,因此所有组件都以其首选高度显示,并且组件之间不会出现间隙。ffscu2ro2#
此处的解决方案是在面板上添加一个 glue。在本例中为最后一个组件。Oracle文档中对 glue 的描述如下:
粘合-使用此选项可指定布局中多余空间的放置位置。可将其视为一种弹性粘合剂-可拉伸和扩展,但不会占用空间,除非您将其所粘附的组件拉开。例如,通过在从左到右的框中的两个组件之间放置水平粘合剂,您可以在这些组件之间放置任何多余空间,而不是在所有组件的右侧放置。