组件、容器、三种布局管理


1.frame

public class TestFrame {                            
    public static void main(String[] args) {        
        Frame frame = new Frame("我的第一个java图形界面窗口"); 
                                                    
        //设置可见性                                     
        frame.setVisible(true);                     
                                                    
        //设置窗口大小                                    
        frame.setSize(400,400);                     
                                                    
        //设置窗口颜色                                    
        frame.setBackground(new Color(25, 207, 213))
                                                    
        //弹出的初始位置                                   
        frame.setLocation(200,200);                 
                                                    
        //设置大小不可变                                   
        frame.setResizable(false);                  
    }                                               
}                                                   

image-20220302160221615

问题:发现窗口关不掉,停止程序运行!

尝试回顾封装:

package com.zhang.lesson;

import java.awt.*;

public class TestFrame2 {
    public static void main(String[] args) {
        MyFrame myFrame1= new MyFrame(100,100,200,200,Color.blue);
        MyFrame myFrame2= new MyFrame(100,300,200,200,Color.red);
        MyFrame myFrame3= new MyFrame(300,100,200,200,Color.green);
        MyFrame myFrame4= new MyFrame(300,300,200,200,Color.magenta);
    }
}

class MyFrame extends Frame {
    static int id=0;
    public MyFrame(int x,int y,int w,int h,Color color){
        super("MyFrame"+(++id));
        setBackground(color);
        setVisible(true);
        setBounds(x,y,w,h);
    }
}

![image-20220302163338248](C:\Users\Shenming Zhang\AppData\Roaming\Typora\typora-user-images\image-20220302163338248.png)

2.面板Panel

解决了关闭窗口问题

package com.zhang.lesson;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestPanel {
    public static void main(String[] args) {
        Frame frame= new Frame();
        Panel panel= new Panel();
        //设置布局
        frame.setLayout(null);
        //设置坐标
        frame.setBounds(100,100,500,500);
        frame.setBackground(new Color(226, 21, 21));

        panel.setBounds(50,50,400,400);
        panel.setBackground(Color.green);
		//添加面板
        frame.setVisible(true);
        frame.add(panel);

        //关闭窗口
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
image-20220302215048288

3.布局管理

  • 流式布局

    package com.zhang.lesson;
    
    import java.awt.*;
    
    public class TestFlowLayout {
        public static void main(String[] args) {
            Frame frame = new Frame();
            Button button1 = new Button("button1");
            Button button2 = new Button("button2");
            Button button3 = new Button("button3");
    
            //设置为流式布局
            //frame.setLayout(new FlowLayout());
            //frame.setLayout(new FlowLayout(FlowLayout.LEFT));
            frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
    
            frame.setSize(200,200);
    
            frame.add(button1);
            frame.add(button2);
            frame.add(button3);
    
            frame.setVisible(true);
        }
    }
    
  • 东西南北中

    package com.zhang.lesson;
    
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class TestBorderLayout {
        public static void main(String[] args) {
            Frame frame = new Frame("东西南北中");
    
            Button east = new Button("East");
            Button west = new Button("West");
            Button south = new Button("South");
            Button north = new Button("North");
            Button center = new Button("Center");
    
            frame.add(east,BorderLayout.EAST);
            frame.add(west,BorderLayout.WEST);
            frame.add(south,BorderLayout.SOUTH);
            frame.add(north,BorderLayout.NORTH);
            frame.add(center,BorderLayout.CENTER);
    
            frame.setSize(400,400);
            frame.setVisible(true);
    
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    
  • 表格布局(Grid)

    package com.zhang.lesson;
    
    import java.awt.*;
    
    public class TestGridLayout {
        public static void main(String[] args) {
            Frame frame = new Frame("表格布局");
    
            Button button1 = new Button("button1");
            Button button2 = new Button("button2");
            Button button3 = new Button("button3");
            Button button4 = new Button("button4");
            Button button5 = new Button("button5");
            Button button6 = new Button("button6");
    
            frame.setLayout(new GridLayout(3,2));
    
            frame.add(button1);
            frame.add(button2);
            frame.add(button3);
            frame.add(button4);
            frame.add(button5);
            frame.add(button6);
    
            frame.pack();
            frame.setVisible(true);
        }
    }
    
  • 练习

package com.zhang.lesson;

import java.awt.*;

public class PracticeDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("PracticeDemo");

        Panel p1 = new Panel(new BorderLayout());
        Panel p2 = new Panel(new BorderLayout());
        Panel p3 = new Panel(new GridLayout(2,1));
        Panel p4 = new Panel(new GridLayout(2,2));

        frame.setLayout(new GridLayout(2,1));

        frame.add(p1);
        frame.add(p2);

        p1.add(new Button("b1"),BorderLayout.WEST);
        p1.add(p3,BorderLayout.CENTER);
        p1.add(new Button("b4"),BorderLayout.EAST);

        p3.setLayout(new GridLayout(2,1));
        p3.add(new Button("b2"));
        p3.add(new Button("b3"));

        p2.add(new Button("b5"),BorderLayout.WEST);
        p2.add(p4,BorderLayout.CENTER);
        p2.add(new Button("b10"),BorderLayout.EAST);

        p4.setLayout(new GridLayout(2,2));
        p4.add(new Button("b6"));
        p4.add(new Button("b7"));
        p4.add(new Button("b8"));
        p4.add(new Button("b9"));

        frame.setSize(400,300);
        frame.setLocation(300,300);
        frame.setBackground(Color.blue);
        frame.setVisible(true);
    }
}

![image-20220305220340425](C:\Users\Shenming Zhang\AppData\Roaming\Typora\typora-user-images\image-20220305220340425.png)

总结

  1. Frame是一个顶级窗口
  2. Panel无法单独显示,必须添加到某个容器中
  3. 布局管理器:流式、东西南北中、表格
  4. 大小、定位、背景颜色、可见性、监听器!