可滚动JPanel中的Swing流布局中断元素

时间:2016-10-13 15:00:06

标签: java swing user-interface awt layout-manager

我试图将多张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);

    }
}

enter image description here

编辑根据以下给出的答案。我按this Class

更改了我的实施
ScrollablePanel pnlTrSet = new ScrollablePanel(new FlowLayout());
pnlTrSet.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
pnlTrSet.setScrollableBlockIncrement(
       ScrollablePanel.VERTICAL, ScrollablePanel.IncrementType.PIXELS, 230);

enter image description here

1 个答案:

答案 0 :(得分:3)

您需要实现面板的Scrollable界面,使其宽度固定为滚动窗格视口的大小。

基本上你需要覆盖getScrollableTracksViewportWidth()方法才能返回“true”。

一种简单的方法是使用Scrollable Panel。它有一个方法,允许您控制此属性。

编辑:

以上只会阻止水平滚动条出现。但是,FlowLayout将继续显示单行上的所有按钮,因为面板的首选大小计算仍然不正确。

要使按钮换行,必须使用Wrap Layout替换面板的FlowLayout。 Wrap Layout将正确地重新计算面板的首选高度,以便组件可以换行并且可以显示垂直滚动条。