可滚动 JPanel 中的 Swing 流布局中断元素
Swing flow layout break element in scrollable JPanel
我正在尝试将多张 JPanel
卡片放入我的主面板。如果新的卡片面板不合适,我希望将它放在下一行。在下图中,您会看到我所有的卡片面板都向右移动,如果我设置 HORIZONTAL_SCROLLBAR_ALWAYS
水平滚动有效。所以在这里我想要在主面板的每一行中有 4 个卡片面板,以便垂直滚动。
public class PanelTraining extends JPanel{
private static final long serialVersionUID = 1L;
public PanelTraining(List<FccMeta> ffcms) {
super(new BorderLayout()); // set layout to absolute
setPreferredSize(new Dimension(880, 580));
setBorder(new LineBorder(Color.decode("#A11E1E"),1, true));
JPanel pnlChart = new JPanel();
pnlChart.setPreferredSize(new Dimension(860, 180));
pnlChart.setBackground(Color.YELLOW);
add(pnlChart, BorderLayout.NORTH);
JPanel pnlTrSet = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 5));
//pnlTrSet.setSize(860, 380);
for (FccMeta fccMeta : ffcms) {
JPanel pnlCard = new MyCustomPanelCard();
pnlTrSet.add(pnlCard);
}
JScrollPane scroll = new JScrollPane(pnlTrSet);
//scroll.setPreferredSize(new Dimension(860, 380));
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
add(scroll, BorderLayout.CENTER);
}
}
EDIT 根据下面给出的答案。我通过 this Class
更改了我的实现
ScrollablePanel pnlTrSet = new ScrollablePanel(new FlowLayout());
pnlTrSet.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
pnlTrSet.setScrollableBlockIncrement(
ScrollablePanel.VERTICAL, ScrollablePanel.IncrementType.PIXELS, 230);
您需要实现面板的 Scrollable
接口,以将宽度固定为滚动窗格视口的大小。
基本上,您需要将 getScrollableTracksViewportWidth()
方法重写为 return “true”。
一个简单的方法是使用 Scrollable Panel。它有一个方法可以让你控制这个 属性.
编辑:
以上只会阻止水平滚动条出现。但是,FlowLayout 将继续在一行中显示所有按钮,因为面板的首选大小计算仍然不正确。
要让按钮换行,您必须将面板的 FlowLayout 替换为 Wrap Layout。 Wrap Layout
将正确重新计算面板的首选高度,以便组件可以换行并显示垂直滚动条。
我正在尝试将多张 JPanel
卡片放入我的主面板。如果新的卡片面板不合适,我希望将它放在下一行。在下图中,您会看到我所有的卡片面板都向右移动,如果我设置 HORIZONTAL_SCROLLBAR_ALWAYS
水平滚动有效。所以在这里我想要在主面板的每一行中有 4 个卡片面板,以便垂直滚动。
public class PanelTraining extends JPanel{
private static final long serialVersionUID = 1L;
public PanelTraining(List<FccMeta> ffcms) {
super(new BorderLayout()); // set layout to absolute
setPreferredSize(new Dimension(880, 580));
setBorder(new LineBorder(Color.decode("#A11E1E"),1, true));
JPanel pnlChart = new JPanel();
pnlChart.setPreferredSize(new Dimension(860, 180));
pnlChart.setBackground(Color.YELLOW);
add(pnlChart, BorderLayout.NORTH);
JPanel pnlTrSet = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 5));
//pnlTrSet.setSize(860, 380);
for (FccMeta fccMeta : ffcms) {
JPanel pnlCard = new MyCustomPanelCard();
pnlTrSet.add(pnlCard);
}
JScrollPane scroll = new JScrollPane(pnlTrSet);
//scroll.setPreferredSize(new Dimension(860, 380));
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
add(scroll, BorderLayout.CENTER);
}
}
EDIT 根据下面给出的答案。我通过 this Class
更改了我的实现ScrollablePanel pnlTrSet = new ScrollablePanel(new FlowLayout());
pnlTrSet.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
pnlTrSet.setScrollableBlockIncrement(
ScrollablePanel.VERTICAL, ScrollablePanel.IncrementType.PIXELS, 230);
您需要实现面板的 Scrollable
接口,以将宽度固定为滚动窗格视口的大小。
基本上,您需要将 getScrollableTracksViewportWidth()
方法重写为 return “true”。
一个简单的方法是使用 Scrollable Panel。它有一个方法可以让你控制这个 属性.
编辑:
以上只会阻止水平滚动条出现。但是,FlowLayout 将继续在一行中显示所有按钮,因为面板的首选大小计算仍然不正确。
要让按钮换行,您必须将面板的 FlowLayout 替换为 Wrap Layout。 Wrap Layout
将正确重新计算面板的首选高度,以便组件可以换行并显示垂直滚动条。