Java 几种常见的布局管理

  使用Eclipse做Java的WinForm程序时,并没有拖拉控件的方式。在VS里感受了拖拉控件的好处,看到Java没有,感觉很不习惯。但是Java提供了各种各样的布局管理,使用这些布局管理可以做到更精确的布局吧?我只是想简单的接触下Java,而且这块感觉就像Java所特有的,不太喜欢。所以简单了解一下就可以了!

  AWT(Abstract Windows Toolkit)抽象窗口开发包,用于Java ApplicationGUI编程。本质是希望跨平台。ContainerComponentAWT中两个核心类。

  Component又包括一个子类ContainerJava图形用户界面最基本组成部分是ComponentComponent类及其子类的对象用来描述以图形化方式显示在屏幕上并能与用户进行交互的GUI元素。一般的Component对象不能独立的显示出来,必须与某一Container对象中才可以显示出来。

创建Windows窗体的方法一

View Code
public class vvv {
    public static void main(String[] args) throws Exception {    
        Frame f = new Frame("Test");
        f.setSize(170,200);
        f.setBackground(Color.blue);
        f.setVisible(true);
        f.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                System.exit(0);
            }
        });
    }
}

创建Windows窗体的方法二

View Code
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class vvv {
    public static void main(String[] args) throws Exception {

        MyFrame frame = new MyFrame("这是一个窗体", 100, 100, 300, 400, Color.blue);
    }
}

class MyFrame extends Frame {
    MyFrame(String name, int x, int y, int width, int height, Color c) {
        super(name);
        this.setBackground(c);
        this.setBounds(x, y, width, height);
        this.setVisible(true);
        this.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                System.exit(0);
            }
        });
    }
}

 

AWT提供了5种布局管理器类
FlowLayout 、BorderLayout、GridLayout、CardLayout、GridBagLayout

1.FlowLayout是Panel类的默认布局管理器。
FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。可以设不同的间距及对齐方式,默认的对齐方式是局中。

View Code
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class vvv {
    public static void main(String[] args) throws Exception {
        
        Frame f = new Frame("FlowLayout Demo");
        Button btn1 = new Button("Button1");
        Button btn2 = new Button("Button2");
        Button btn3 = new Button("Button3");
        Button btn4 = new Button("Button4");
        Button btn5 = new Button("Button5");
        Button btn6 = new Button("Button6");
        Button btn7 = new Button("Button7");
        
        Panel panel = new Panel();
        panel.setLayout(new FlowLayout(FlowLayout.LEFT,25,25));//设置向左对齐,垂直间距5,水平间距5
        panel.add(btn1);
        panel.add(btn2);
        panel.add(btn3);
        panel.add(btn4);
        panel.add(btn5);
        panel.add(btn6);
        panel.add(btn7);
        
        f.setBounds(100, 100, 500, 400);
        f.add(panel);
        f.setVisible(true);
        f.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                // TODO Auto-generated method stub
                super.windowClosing(e);
                System.exit(0);
            }
        });
        
    }
}

2.BorderLayout是Frame类的默认布局管理器,BorderLayout将整个容器的布局划分成
东(EAST)西(WEST)南(SOUTH)北(NORTH)中(CENTER)
如不指定组件的加入部位,则默认加入到CENTER区。
每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。

View Code
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class vvv {
    public static void main(String[] args) throws Exception {
        
        Frame f = new Frame("FlowLayout Demo");
        Button btn1 = new Button("Button1");
        Button btn2 = new Button("Button2");
        Button btn3 = new Button("Button3");
        Button btn4 = new Button("Button4");
        Button btn5 = new Button("Button5");
        
        f.setLayout(new BorderLayout());
        f.add(btn1,BorderLayout.EAST);
        f.add(btn2,BorderLayout.WEST);
        f.add(btn3,BorderLayout.NORTH);
        f.add(btn4,BorderLayout.SOUTH);
        f.add(btn5,BorderLayout.CENTER);
        
        f.setBounds(100, 100, 500, 400);
        f.setVisible(true);
        f.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                // TODO Auto-generated method stub
                super.windowClosing(e);
                System.exit(0);
            }
        });
        
    }
}

3.GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。组件被添加到每个单元格中,先从左到右满一行后换行,再从上到下。
在GridLayout构造方法中指定分割的行数和列数
如:GridLayout(3,4);

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class vvv {
    public static void main(String[] args) throws Exception {
        
        Frame f = new Frame("GridLayout Demo");
        Button btn1 = new Button("Button1");
        Button btn2 = new Button("Button2");
        Button btn3 = new Button("Button3");
        Button btn4 = new Button("Button4");
        Button btn5 = new Button("Button5");
        Button btn6 = new Button("Button6");
        Button btn7 = new Button("Button7");
        Button btn8 = new Button("Button8");
        Button btn9 = new Button("Button9");
        Button btn10 = new Button("Button10");
        
        
        f.setLayout(new GridLayout(3,4));
        f.add(btn1);
        f.add(btn2);
        f.add(btn3);
        f.add(btn4);
        f.add(btn5);
        f.add(btn6);
        f.add(btn7);
        f.add(btn8);
        f.add(btn9);
        f.add(btn10);
        
        f.setBounds(100, 100, 250, 150);
        f.setVisible(true);
        f.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                // TODO Auto-generated method stub
                super.windowClosing(e);
                System.exit(0);
            }
        });
        
    }
}

  

  如果在Frame想加入Panel的布局,那么需先将Frame有布局方式清空。
  布局管理器的总结:Frame是一个顶级窗口,Frame的缺省布局管理器为BorderLayout。所以如果直接往Frame里面放一个Panel,他将会把Panel放大居中。如果用户需要亲自设置组件大小或位置,则应取消容器的布局管理器,方法为 setLayout(null);

原文地址:https://www.cnblogs.com/cxeye/p/2709073.html