Swing五种常见的布局器

布局器是用在容器上的。 用来决定容器上的组件摆放的位置和大小

  • 绝对定位

    绝对定位就是指不使用布局器,组件的位置和大小需要单独指定

    package gui;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    public class TestGUI {
        public static void main(String[] args) {
     
            JFrame f = new JFrame("LoL");
            f.setSize(400, 300);
            f.setLocation(200, 200);
            // 设置布局器为null,即进行绝对定位,容器上的组件都需要指定位置和大小
            f.setLayout(null);
            JButton b1 = new JButton("英雄1");
            // 指定位置和大小
            b1.setBounds(50, 50, 80, 30);
            JButton b2 = new JButton("英雄2");
            b2.setBounds(150, 50, 80, 30);
            JButton b3 = new JButton("英雄3");
            b3.setBounds(250, 50, 80, 30);
            // 没有指定位置和大小,不会出现在容器上
            JButton b4 = new JButton("英雄3");
     
            f.add(b1);
            f.add(b2);
            f.add(b3);
            // b4没有指定位置和大小,不会出现在容器上
            f.add(b4);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            f.setVisible(true);
        }
    }
  • FlowLayout

    设置布局器为FlowLayout,顺序布局器
    容器上的组件水平摆放
    加入到容器即可,无需单独指定大小和位置


    package gui;
     
    import java.awt.FlowLayout;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    public class TestGUI {
        public static void main(String[] args) {
     
            JFrame f = new JFrame("LoL");
            f.setSize(400, 300);
            f.setLocation(200, 200);
            // 设置布局器为FlowLayerout
            // 容器上的组件水平摆放
            f.setLayout(new FlowLayout());
     
            JButton b1 = new JButton("英雄1");
            JButton b2 = new JButton("英雄2");
            JButton b3 = new JButton("英雄3");
     
            // 加入到容器即可,无需单独指定大小和位置
            f.add(b1);
            f.add(b2);
            f.add(b3);
     
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            f.setVisible(true);
        }
    }
  • BorderLayout

    设置布局器为BorderLayout
    容器上的组件按照上北 下南 左西 右东 中的顺序摆放



    package gui;
     
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    public class TestGUI {
        public static void main(String[] args) {
     
            JFrame f = new JFrame("LoL");
            f.setSize(400, 300);
            f.setLocation(200, 200);
            // 设置布局器为BorderLayerout
            // 容器上的组件按照上北下南左西右东中的顺序摆放
            f.setLayout(new BorderLayout());
     
            JButton b1 = new JButton("洪七");
            JButton b2 = new JButton("段智兴");
            JButton b3 = new JButton("欧阳锋");
            JButton b4 = new JButton("黄药师");
            JButton b5 = new JButton("周伯通");
     
            // 加入到容器的时候,需要指定位置
            f.add(b1, BorderLayout.NORTH);
            f.add(b2, BorderLayout.SOUTH);
            f.add(b3, BorderLayout.WEST);
            f.add(b4, BorderLayout.EAST);
            f.add(b5, BorderLayout.CENTER);
     
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            f.setVisible(true);
        }
    }
  • GridLayout

    GridLayout,即网格布局器



    package gui;
     
    import java.awt.GridLayout;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    public class TestGUI {
        public static void main(String[] args) {
     
            JFrame f = new JFrame("LoL");
            f.setSize(400, 300);
            f.setLocation(200, 200);
            // 设置布局器为GridLayerout,即网格布局器
            // 该GridLayerout的构造方法表示该网格是2行3列
            f.setLayout(new GridLayout(2, 3));
     
            JButton b1 = new JButton("洪七");
            JButton b2 = new JButton("段智兴");
            JButton b3 = new JButton("欧阳锋");
            JButton b4 = new JButton("黄药师");
            JButton b5 = new JButton("周伯通");
     
            f.add(b1);
            f.add(b2);
            f.add(b3);
            f.add(b4);
            f.add(b5);
     
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            f.setVisible(true);
        }
    }
  • setPreferredSize

    即便 使用 布局器 ,也可以 通过setPreferredSize,向布局器建议该组件显示的大小.
    注 只对部分布局器起作用,比如FlowLayout可以起作用。 比如GridLayout就不起作用,因为网格布局器必须对齐



    package gui;
     
    import java.awt.Dimension;
    import java.awt.FlowLayout;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    public class TestGUI {
        public static void main(String[] args) {
     
            JFrame f = new JFrame("LoL");
            f.setSize(400, 300);
            f.setLocation(200, 200);
            f.setLayout(new FlowLayout());
     
            JButton b1 = new JButton("英雄1");
            JButton b2 = new JButton("英雄2");
            JButton b3 = new JButton("英雄3");
     
            // 即便 使用 布局器 ,也可以 通过setPreferredSize,向布局器建议该组件显示的大小
            b3.setPreferredSize(new Dimension(180, 40));
     
            f.add(b1);
            f.add(b2);
            f.add(b3);
     
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            f.setVisible(true);
        }
    }
  • CardLayout

    因为CardLayout需要用到面板,JComboBox这些内容

    CardLayerout 布局器 很像TTabbedPanel ,在本例里面上面是一个下拉框,下面是一个CardLayerout 的JPanel
    这个JPanel里有两个面板,可以通过CardLayerout方便的切换



    package gui;
     
    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
     
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    public class TestGUI {
     
        public static void main(String[] args) {
            JFrame f = new JFrame("CardLayerout");
     
            JPanel comboBoxPane = new JPanel();
            String buttonPanel = "按钮面板";
            String inputPanel = "输入框面板";
            String comboBoxItems[] = { buttonPanel, inputPanel };
            JComboBox<String> cb = new JComboBox<>(comboBoxItems);
            comboBoxPane.add(cb);
     
            // 两个Panel充当卡片
            JPanel card1 = new JPanel();
            card1.add(new JButton("按钮 1"));
            card1.add(new JButton("按钮 2"));
            card1.add(new JButton("按钮 3"));
     
            JPanel card2 = new JPanel();
            card2.add(new JTextField("输入框", 20));
     
            JPanel cards; // a panel that uses CardLayout
            cards = new JPanel(new CardLayout());
            cards.add(card1, buttonPanel);
            cards.add(card2, inputPanel);
     
            f.add(comboBoxPane, BorderLayout.NORTH);
            f.add(cards, BorderLayout.CENTER);
     
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(250, 150);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
     
            cb.addItemListener(new ItemListener() {
     
                @Override
                public void itemStateChanged(ItemEvent evt) {
                    CardLayout cl = (CardLayout) (cards.getLayout());
                    cl.show(cards, (String) evt.getItem());
                }
            });    
        }
             
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值