如何设置流动布局JPanel的最大宽度?

时间:2015-04-13 12:47:09

标签: java swing layout-manager flowlayout

enter image description here

如图所示:外部是JPanel_1 BorderLayout;左侧是JPanel_1西侧的JPanel_2,它使用GridBadLayout;在JPanel_2中有几个面板,每个面板包含多个JButton

问题是,当JPanel_3使用FlowLayout时,我尝试使用最大宽度设置它,以便当按钮太多时按钮会自动更改行。但是,无论使用JPanelsizemaximumSize设置哪个preferred size,它都无法正常工作。按钮保持在一行,使得JPanel对我来说太宽了。

任何人都有解决方案吗?谢谢!

2 个答案:

答案 0 :(得分:3)

  

这样当按钮太多时按钮会自动改变线条。

您可以使用Wrap Layout。当可用宽度发生变化时,它会将组件动态地流向新行。

WrapLayout是FlowLayout的扩展,它将在组件包装时正确计算面板的首选大小。

答案 1 :(得分:2)

您可以扩展FlowLayout以限制像这样的首选宽度

import javax.swing.*;
import java.awt.*;

public class TestMaxWidthFlowLayout {

    public static void main(String[] args) {
        JFrame f=new JFrame();
        JPanel pButtons=new JPanel(new FlowLayout() {
            public Dimension preferredLayoutSize(Container target) {
                Dimension sd=super.preferredLayoutSize(target);

                sd.width=Math.min(200, sd.width);

                return sd;
            }
        });
        for (int i=0;i<20; i++) {
            pButtons.add(new JButton("b-"+i));
        }

        f.add(pButtons, BorderLayout.WEST);
        f.add(new JLabel("center"), BorderLayout.CENTER);

        f.setSize(500, 300);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}