• 6.Java-GUI布局管理器


    布局管理器

    Java的GUI组件都放置在容器中,他们的位置是由容器的布局管理器来管理的.在前面的程序中,并没有指定将OK按钮放置在框架的什么位置,但是,Java知道应该把它放置在哪里,因为在后台工作的布局管理器能够将组件放到正确的位置.布局管理器是使用布局管理器类创建的.

    我们可以使用setLayout() 方法在容器中设置布局管理器.

    我们将要了解FlowLayout GridLayout BorderLayout

    FlowLayout流式布局

    FlowLayout(流式布局)是最简单布局管理器. Jpanel容器默认的布局管理器 

    流式布局,按照组件添加的顺序,从左到到右将组件排列在容器中.当放满一行,就开始新的一行.在FlowLayout有3个常量FlowLayout可以指定组件的对齐方式.

    LEFT   每一行组件都应该是左对齐的

    RIGHT  每一行组件都应该是右对齐的

    CENTER  每一行组件都应该是居中的

    还可以指定组件之间的以像素为单位的间隔.

    int getHgap() 
              获取组件之间以及组件与 Container 的边之间的水平间隙。 
    int getVgap() 
              获取组件之间以及组件与 Container 的边之间的垂直间隙。
    void setHgap(int hgap) 
              设置组件之间以及组件与 Container 的边之间的水平间隙。 
    void setVgap(int vgap) 
              设置组件之间以及组件与 Container 的边之间的垂直间隙。

    这个布局管理器的对其方式默认值是CENTER 

    这个布局管理器的水平间隔默认值是 5个像素

    这个布局管理器的垂直间隔默认是是5个像素

    创建该布局管理器

    FlowLayout() 
              构造一个新的 FlowLayout,它是居中对齐的,默认的水平和垂直间隙是 5 个单位。
    FlowLayout(int align) 
              构造一个新的 FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是 5 个单位。
    FlowLayout(int align, int hgap, int vgap) 
              创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。

    案例:创建框架,使用流失布局管理器.向该框架添加三个标签和文本域.

    public class ShowFlowLayout extends JFrame {
    
        public ShowFlowLayout() {
            super.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 20));
    
            add(new JLabel("姓名:"));
            add(new JTextField(8));
            add(new JLabel("邮箱:"));
            add(new JTextField(8));
            add(new JLabel("电话:"));
            add(new JTextField(8));
            
        }
    
        public static void main(String[] args) {
            ShowFlowLayout frame = new ShowFlowLayout();
            frame.setTitle("FlowLayout");
            frame.setSize(500, 200);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }

    该案例在本类main方法中创建了一个本类对象. 该类的构造函数中创建并且添加组件.

    该案例使用了FlowLayout管理器在框架放置组件.如果改变框架的大小.组建会自动的重新排列,以适应框架.

    例如:

    如果将同一个按钮在框架中添加10次,那么该框架只会出现一次,将一个按钮向容器中添加多以和一次是一样的.

    GridLayout网格布局

    GridLyaout是以网格形式管理组件的.组件按照他们添加的顺序从左到右排列,显示第一行,接着是第二行,一次类推.

    Gridlayout可以指定网格中的行数和列数

    规则如下:

    行数和列数可以是0但是不能两者都为0.

    如果一个为0另外一个不为0,那么不为0的行或列的大小就是固定的,为0的行或者列有布局管理器动态决定.

    例如:如果指定一个网格有0行3列10个组件,GirdLayout会创建3个固定的列和行,最后一行只有一个组件.如果指定一个网格有3行0列10个组件,GridLayout就会创建3行4列,最后一行包含2个组件.

    如果行数和列数都不为0,那么以行数为依据.所以行数是固定的,布局管理器会动态的计算列数.例如,如果指定一个网格有3行3列10个组件,GridLayout会创建3个固定的行和4列,最后一行包含2个组件.

    构造方法

    GridLayout() 
              创建具有默认值的网格布局,即每个组件占据一行一列。 
    GridLayout(int rows, int cols) 
              创建具有指定行数和列数的网格布局。 
    GridLayout(int rows, int cols, int hgap, int vgap) 
              创建具有指定行数和列数,水平间隔,垂直间隔的网格布局。

    方法:

    int getRows() 
              获取此布局中的行数。 默认值是1
    int getColumns() 
              获取此布局中的列数。 默认值是1
     int getHgap() 
              获取组件之间的水平间距。 默认值是0
    int getVgap() 
              获取组件之间的垂直间距。默认值是0
    
    设置
    void setRows(int rows) 
              将此布局中的行数设置为指定值。默认值是1
    void setColumns(int cols) 
              将此布局中的列数设置为指定值。  默认值是1
     void setHgap(int hgap) 
              将组件之间的水平间距设置为指定值。  默认值是0
     void setVgap(int vgap) 
              将组件之间的垂直间距设置为指定值。默认值是0

    案例:该案例依然添加3个标签和3个文本域,只不过布局管理器是GrigLayout

    public class ShowGridLayout extends JFrame {
        public ShowGridLayout() {
            setLayout(new GridLayout(3, 2, 5, 5));
    
            add(new JLabel("姓名:"));
            add(new JTextField(8));
            add(new JLabel("邮箱:"));
            add(new JTextField(8));
            add(new JLabel("电话:"));
            add(new JTextField(8));
        }
    
        public static void main(String[] args) {
            ShowGridLayout frame = new ShowGridLayout();
            frame.setTitle("GridLayout");
            frame.setSize(200, 125);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }

    例如:

    如果使用setLayout(new GridLayout(3,10))替换setlayout语句,还是会得到3行2列,因为行的参数非零,所以列的参数会被忽略.列的实际参数是由布局管理器计算出来的.

    BorderLayout边框布局

    边框布局,JFrame 容器默认的布局管理器是边框布局.该管理器将容器非为东西南北中5个区域.我们使用add(Component,index)方法可以将组件添加进到BorderLayout中,index是一个常量,有5个值

    EAST 
              东区域的布局约束(容器右边)。
    WEST 
              西区域的布局约束(容器左边)。
    SOUTH 
              南区域的布局约束(容器底部)。
    NORTH 
              北区域的布局约束(容器顶部)。
    CENTER 
              中间区域的布局约束(容器中央)。

    构造函数

    BorderLayout() 
              构造一个组件之间没有间距的新边框布局。 
    BorderLayout(int hgap, int vgap) 
              构造一个具有指定组件间距的边框布局。

    方法:

    int getHgap() 
              返回组件之间的水平间距。
    int getVgap() 
              返回组件之间的垂直间距。
    void setHgap(int hgap) 
              设置组件之间的水平间距。 默认值是0
     void setVgap(int vgap) 
              设置组件之间的垂直间距。默认值是0

    组件会根据他们最合适的尺寸和在容器中的位置来放置,南北组件可以水平拉伸,东西组件可以垂直拉伸,中央组件既可以水平拉伸也可以垂直拉伸.

    案例:演示边框布局管理器

    public class ShowBorderLayout extends JFrame {
        public ShowBorderLayout() {
            setLayout(new BorderLayout(5, 10));
    
            add(new JButton("东"), BorderLayout.WEST);
            add(new JButton("西"), BorderLayout.EAST);
            add(new JButton("南"), BorderLayout.SOUTH);
            add(new JButton("北"), BorderLayout.NORTH);
            add(new JButton("中"), BorderLayout.CENTER);
        }
    
        public static void main(String[] args) {
            ShowBorderLayout frame = new ShowBorderLayout();
            frame.setTitle("BorderLayout");
            frame.setSize(300, 200);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }

    注意: 如果布局管理器为Border管理器,调用add方法,没有说明组件的位置(东西南北中)默认是center.

    所以

    add(new JButton("ok"))和 add(new JButton("ok"), BorderLayout.CENTER )

    效果是一样的.

    如果在Border容器中添加2个组件,都没有指定位置,那么只会显示最后一个组件

    add(new JButton("ok1"))和add(new JButton("ok2")) 只会显示ok2

    使用布局管理器

    代码:

    public class CommonComponent extends JFrame {
        public CommonComponent() {
            // 菜单条
            JMenuBar bar = new JMenuBar();
            // 菜单
            JMenu menu = new JMenu("文件");
            // 菜单选项
            JMenuItem myNew = new JMenuItem("新建");
            JMenuItem myOpen = new JMenuItem("打开");
            bar.add(menu);
            menu.add(myNew);
            menu.add(myOpen);
            add(bar, BorderLayout.NORTH);
    
            // 面板
            JPanel p1 = new JPanel();
            p1.setLayout(new GridLayout(2, 2, 5, 5));
            add(p1);
    
            // 标签
            JLabel name = new JLabel("用户名:");
            p1.add(name);
    
            // 文本域
            JTextField field = new JTextField(8);
            p1.add(field);
    
            // 标签
            JLabel passwd = new JLabel("密码");
            p1.add(passwd);
            // 密码域
            JPasswordField pass = new JPasswordField(8);
            p1.add(pass);
    
            JPanel p2 = new JPanel();
            // 单选按钮
            JLabel gender = new JLabel("性别");
            p2.add(gender);
            JRadioButton male = new JRadioButton("男");
            JRadioButton female = new JRadioButton("女");
            // 单选按钮组,同一个单选按钮组的互斥.
            ButtonGroup group = new ButtonGroup();
            group.add(male);
            group.add(female);
            // 注意,单选按钮组不能添加进容器
            p2.add(male);
            p2.add(female);
    
            JPanel p3 = new JPanel();
            // 复选框
            JLabel like = new JLabel("爱好:");
            p3.add(like);
            JCheckBox eat = new JCheckBox("吃饭");
            JCheckBox movie = new JCheckBox("看电影");
            JCheckBox sleep = new JCheckBox("睡觉");
            p3.add(eat);
            p3.add(movie);
            p3.add(sleep);
    
            JPanel p4 = new JPanel(new GridLayout(1, 0, 5, 5));
            // 文本域
            JLabel info = new JLabel("个人简介:");
            p4.add(info);
            JTextArea area = new JTextArea(50, 10);
            p4.add(area);
    
            JPanel p5 = new JPanel(new BorderLayout());
            // 列表
            String[] data = { "one", "two", "three" };
            JList list = new JList(data);
            p5.add(list, BorderLayout.WEST);
    
            JPanel p6 = new JPanel();
            // 普通按钮
            JButton button = new JButton("注册");
            p6.add(button);
            JButton button2 = new JButton("取消");
            p6.add(button2);
    
            setLayout(new GridLayout(7, 1, 5, 5));
            add(p1);
            add(p2);
            add(p3);
            add(p4);
            add(p5);
            add(p6);
    
        }
    
        public static void main(String[] args) {
            CommonComponent frame = new CommonComponent();
            frame.setTitle("常用组件");
            frame.setSize(400, 600);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // 自适应
            // frame.pack();
            frame.setVisible(true);
        }
    }

    格式如下:

    需求:需要在一个Jframe框架中放置10个按钮和一个文本域.

    要求按钮以网格形式放置,文本域单独一行.

    如果将这些组件放在一个单独的容器中,很难达要去的效果.我们使用Java图形用户界面进行程序设计时,可以将一个窗口分成几个面板Jpanel.面板的作用就是分组放置用户界面的子容器.这里可以将按钮添加到一个面板中,然后经面板添加到框架中.

    在Swing中的面板是JPanel 可以使用new Jpanel () 创建一个默认是FlowLayout管理器的面板,也可以使用newJPanel(LayoutManager) 创建一个带特定布局管理器的面板.使用add方法将组件添加进面板中.

    例如:

    public class ShowJPanel extends JFrame {
        ShowJPanel() {
            JButton button = new JButton("ok");
            JPanel jPanel = new JPanel();
            jPanel.add(button);
            add(jPanel);
        }
    
        public static void main(String[] args) {
            ShowJPanel frame = new ShowJPanel();
            frame.setTitle("面板");
            frame.setSize(200, 200);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }

    图示:

    进按钮添加进面板面板添加进容器

    进按钮直接添加进框架.

    案例:

    public class TestPanel extends JFrame {
        public TestPanel() {
            // 创建面板,默认是流式布局
            JPanel p1 = new JPanel();
            // 指定为网格布局,4行3列
            p1.setLayout(new GridLayout(4, 3));
            for (int i = 1; i <=9; i++) {
                p1.add(new JButton("" + i));
            }
            p1.add(new JButton("0"));
            p1.add(new JButton("OK"));
            p1.add(new JButton("EXIT"));
    
            // 创建面板,指定边框布局
            JPanel p2 = new JPanel(new BorderLayout());
            // 面板添加文本域,边框北部
            p2.add(new JTextField("我在这里啊!!!"), BorderLayout.NORTH);
            // 面板添加其他面板,边框中部.
            p2.add(p1, BorderLayout.CENTER);
    
            // 框架添加面板,框架的布局默认就是边框布局,面板指定位于框架西部
            add(p2, BorderLayout.EAST);
            // 框架添加按钮,位于框架总部.
            add(new JButton("哈哈"), BorderLayout.CENTER);
    
        }
    
        public static void main(String[] args) {
            TestPanel frame = new TestPanel();
            frame.setTitle("JPanel");
            frame.setSize(400, 260);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }

    该案例中创建了两个面板(Jpanel) , 面板的默认布局是流式布局.,可以使用setLayout 更改面板的布局( setLayout 是java.awt.Container定义的, Jpanel 是Container的子类).

    该案例中

    面板p1布局指定为GridLayout(网格布局)将12个按钮,添加进面板p1中.

       面板p2 布局指定为BorderLayout,将p1面板添加进来, p1位于该面板的中部.再添加一个文本域,位于面板p2北部.

       将面板p2添加进框架(框架布局默认为BorderLayout),位于框架的西部,在框架的中部添加一个按钮.

    效果:

    注意: 面板容器是一个轻量级的容器,该容器不能单独的使用,必须依赖与外层的顶层容器(JFrame)

    author@nohert
  • 相关阅读:
    阅读计划博文
    系统设计时所实现的质量属性战术
    关于如何提高系统的可用性和易用性
    jdbc.properties
    JDBCUtil
    软件质量属性的场景描述
    架构漫谈阅读笔记
    软件架构师工作过程
    orm框架中entityframework的 增删改查操作
    事件和委托
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13670741.html
Copyright © 2020-2023  润新知