GUI编程AWT,面板,布局管理器笔记

GUI编程

GUI编程

  • 告诉大家该怎么学?
    • 这是什么
    • 它怎么玩
    • 该如何去在我们平时运用
  • 组件
    • 窗口
    • 弹窗
    • 面板
    • 文本框
    • 列表框
    • 按钮
    • 图片
    • 监听事件
    • 鼠标
    • 键盘事件
    • 破解工具

1.简介

  • Gui的核心技术:Swing AWT
    • 因为界面不美观
    • 需要jre环境 —逐渐被淘汰
  • 为什么我们要学习
    • 可以写出自己心中想要的一些小工具
    • 工作的时候,也可能需要维护到swing界面,概率极小
    • 了解MVC架构,了解监听!

2.AWT

  • Awt介绍

    • 包含了很多类和接口!GUI:图形用户界面
    • 元素:窗口,按钮,文本框
    • java.awt
    • 组件:包含一些基本组件(button TextArea Label …) 还有容器(Container)基本组件就是存放在容器中
  • 组件和容器

    package com.wang.lesson01;
    
    import java.awt.*;
    
    /**
     * @Auther: 王海新
     * @Date: 2021/2/6 11:21
     * @Description: GUUI的第一个界面
     */
    public class TestFrame {
        public static void main(String[] args) {
    
            //Frame,JDK,看源码(不懂了就直接点进去看源码就可以)
            Frame frame = new Frame("我的第一个java图形界面窗口");
    
            //需要设置可见性
            frame.setVisible(true);
    
            //设置窗口大小
            frame.setSize(400,400);
    
            //设置背景颜色
            frame.setBackground(new Color(104, 135, 219));
    
            //设置初始化位置
            frame.setLocation(200,200);
    
            //设置大小固定
            //frame.setResizable(false);
        }
    }
    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FwqI2KcS-1612844171024)(C:\Users\黑白客\AppData\Roaming\Typora\typora-user-images\image-20210206112937251.png)]

    回顾封装:

    package com.wang.lesson01;
    
    import java.awt.*;
    
    /**
     * @Auther: 王海新
     * @Date: 2021/2/6 11:44
     * @Description:
     */
    public 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);
            setBounds(x,y,w,h);
            setVisible(true);
        }
    }
    
package com.wang.lesson01;

import java.awt.*;

/**
 * @Auther: 王海新
 * @Date: 2021/2/6 11:40
 * @Description: 展示多个窗口 new
 */
public class TestFrame2 {
    public static void main(String[] args) {
    new MyFrame(100,100,200,200,Color.BLACK);
    new MyFrame(300,100,200,200,Color.BLUE);
    new MyFrame(100,300,200,200,Color.yellow);
    new MyFrame(300,300,200,200,Color.red);
    }
}

面板Panel

package com.wang.lesson01;

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

/**
 * @Auther: 王海新
 * @Date: 2021/2/6 16:17
 * @Description:
 */
public class TestPannel {
    public static void main(String[] args) {
        Frame frame = new Frame();
        //布局的概念
        Panel panel = new Panel();

        //设置布局
        frame.setLayout(null);

        //坐标
        frame.setBounds(300,300,500,500);
        frame.setBackground(new Color(85, 186, 85));

        //panel 设置坐标,相对于frame
        panel.setBounds(50,50,400,400);
        panel.setBackground(new Color(193,15,63));

        //frame.add(panel)
        frame.add(panel);

        frame.setVisible(true);

        //监听事件,监听窗口关闭事件System.exit(0)  0 是正常关闭,1是有异常的关闭
        //适配器模式:
        frame.addWindowListener(new WindowAdapter() {
            //窗口点击关闭的时候需要做的事情
            @Override
            public void windowClosing(WindowEvent e) {
                //结束程序
                System.exit(0);
            }
        });
    }
}

问题:发现窗口关闭不了

package com.wang.lesson01;

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

/**
 * @Auther: 王海新
 * @Date: 2021/2/6 16:17
 * @Description:
 */
public class TestPannel {
    public static void main(String[] args) {
        Frame frame = new Frame();
        //布局的概念
        Panel panel = new Panel();

        //设置布局
        frame.setLayout(null);

        //坐标
        frame.setBounds(300,300,500,500);
        frame.setBackground(new Color(85, 186, 85));

        //panel 设置坐标,相对于frame
        panel.setBounds(50,50,400,400);
        panel.setBackground(new Color(193,15,63));

        //frame.add(panel)
        frame.add(panel);

        frame.setVisible(true);

        //监听事件,监听窗口关闭事件System.exit(0)  0 是正常关闭,1是有异常的关闭
        //适配器模式:
        frame.addWindowListener(new WindowAdapter() {
            //窗口点击关闭的时候需要做的事情
            @Override
            public void windowClosing(WindowEvent e) {
                //结束程序
                System.exit(0);
            }
        });
    }
}

布局管理器

  • 流式布局
package com.wang.lesson01;

import java.awt.*;

/**
 * @Auther: 王海新
 * @Date: 2021/2/6 17:02
 * @Description:流式布局
 */
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.setSize(200,200);
        //把按钮添加上去
        frame.add(button1);
        frame.add(button2);
        frame.add(button3);

        frame.setVisible(true);

    }
}
  • 东南西北中

    package com.wang.lesson01;
    
    import java.awt.*;
    
    /**
     * @Auther: 王海新
     * @Date: 2021/2/7 18:03
     * @Description: 东西南北中
     */
    public class TestBorderLayout {
        public static void main(String[] args) {
            //创建了一个面板
            Frame frame = new Frame("TestBorderLayout");
            //创建了东西南北中四个按钮
            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(200,200);
            //设置面板为可显示
            frame.setVisible(true);
        }
    }
    
  • 表格布局Grid

    package com.wang.lesson01;
    
    import java.awt.*;
    
    /**
     * @Auther: 王海新
     * @Date: 2021/2/7 18:16
     * @Description: 表格布局
     */
    public class TestGridLayout {
        public static void main(String[] args) {
            Frame frame = new Frame("TestGridLayout");
    
            //创建了东西南北中四个按钮
            Button but1 = new Button("but1");
            Button but2 = new Button("but2");
            Button but3 = new Button("but3");
            Button but4 = new Button("but4");
            Button but5 = new Button("but5");
            Button but6 = new Button("but6");
    
            frame.setLayout(new GridLayout(3,2));
    
            frame.add(but1);
            frame.add(but2);
            frame.add(but3);
            frame.add(but4);
            frame.add(but5);
            frame.add(but6);
    
            frame.pack();//java函数
            frame.setVisible(true);
        }
    }
    
  • 总结:小demo

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DhYMvNeP-1612844171028)(C:\Users\黑白客\AppData\Roaming\Typora\typora-user-images\image-20210208151738160.png)]

    制作这样一个面板

    package com.wang.lesson01;
    
    import java.awt.*;
    
    /**
     * @Auther: 王海新
     * @Date: 2021/2/8 14:50
     * @Description:  小结作业。
     */
    public class ExDemo {
        public static void main(String[] args) {
            //总 Frame
            Frame frame = new Frame();
            frame.setSize(400,300);
            frame.setLocation(300,400);
            frame.setBackground(Color.BLACK);
            frame.setVisible(true);
            //将整体分割成两行一列,表格布局
            frame.setLayout(new GridLayout(2,1));
    
            //四个面板
            Panel p1 = new Panel(new BorderLayout());
            Panel p2 = new Panel(new GridLayout(2, 1));
            //东南西北中布局
            Panel p3 = new Panel(new BorderLayout());
            Panel p4 = new Panel(new GridLayout(2, 2));
            //上面ok
            p1.add(new Button("East-1"),BorderLayout.EAST);
            p1.add(new Button("West-1"),BorderLayout.WEST);
            p2.add(new Button("p2-btn-1"));
            p2.add(new Button("p2-btn-2"));
            p1.add(p2,BorderLayout.CENTER);
            //下面OK
            p3.add(new Button("East-1"),BorderLayout.EAST);
            p3.add(new Button("West-1"),BorderLayout.WEST);
            for (int i = 0; i < 4; i++) {
                p4.add(new Button("for-" + i));
            }
            p3.add(p4,BorderLayout.CENTER);
    
            frame.add(p1);
            frame.add(p3);
                    frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    

    总结:

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

事件监听

事件监听:当某个事情发生的时候,干什么?

package com.wang.lesson01;

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

/**
 * @Auther: 王海新
 * @Date: 2021/2/8 15:32
 * @Description:  监听器
 */
public class TestActionEvent {
    public static void main(String[] args) {
        //按下按钮,触发一些事件
        Frame frame = new Frame();
        Button button = new Button();
        //因为addActionListener();需要一个ActionListener(),所以我们去构造一个
        MyActionListener myActionListener = new MyActionListener();
        button.addActionListener(myActionListener);

        frame.add(button,BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);

        windowClose(frame);//关闭窗口
    }
    //关闭窗口方法
    public static void windowClose(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

class MyActionListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("aa");
    }
}

多个按钮,共享一个监听

package com.wang.lesson01;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @Auther: 王海新
 * @Date: 2021/2/9 11:54
 * @Description: 两个按钮公用一个监听器
 */
public class TestActionTwo {
    public static void main(String[] args) {
        // 两个按钮,实现同一个监听器
        // 开始   停止
        Frame frame = new Frame("开始-停止");
        Button button1 = new Button("start");
        Button button2 = new Button("start");

        //可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值
        //可以多个按钮,只写一个监听器。
        button2.setActionCommand("button-stop");

        MyMonitor myMonitor = new MyMonitor();
        button1.addActionListener(myMonitor);
        button2.addActionListener(myMonitor);

        frame.add(button1,BorderLayout.NORTH);
        frame.add(button2,BorderLayout.SOUTH);

        //自适应
        frame.pack();
        //显示面板
        frame.setVisible(true);
    }
}

class MyMonitor implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("按钮被点击了:msg"+ e.getActionCommand());
        if (e.getActionCommand().equals("start")) {
            //这里实现某个按钮的单独功能
        }
    }
}
上一篇:【学习笔记】| Java GUI界面


下一篇:java-Toolkit.getImage()的正确路径是什么?