GUI——AWT

AWT(抽象窗口工具)

  • java.awt
  • AWT 中包含了有多的类和接口
  • 其中的元素:窗口、按钮、文本框

在这里插入图片描述

1、Frame

一个界面

/**
 * 学习 GUI 的第一个界面
 */
public class FrameTest {
    public static void main(String[] args) {

        // Frame
        Frame frame = new Frame("我的第一个 Java 图形界面窗口");

        // 需要设置可见性,这个窗口创建是在内存中
        frame.setVisible(true);

        // 设置窗口大小
        frame.setSize(400,400);

        // 设置背景颜色
        frame.setBackground(new Color(188, 110, 90));

        // 设置窗口弹出的初始位置
        frame.setLocation(200,200);

        // 设置窗口大小固定
        frame.setResizable(false);

    }
}

多个界面

public class FrameTest01 {
    public static void main(String[] args) {
        MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.black);
        MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.white);
        MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, Color.yellow);
        MyFrame myFrame4 = new MyFrame(300, 300, 200, 200, Color.red);
    }
}

class MyFrame extends Frame {
    private static int id = 0;

    public MyFrame(int x,int y,int w,int h,Color color){
        super("Myframe" + (++id));

//        // 设置窗口大小
//        setSize(400,400);
//        // 设置窗口弹出的初始位置
//        setLocation(200,200);
        // 设置窗口的弹出位置以及窗口大小
        setBounds(x,y,w,h);

        // 设置背景颜色
        setBackground(color);

        // 设置窗口大小固定
        setResizable(false);

        // 需要设置可见性,这个窗口创建是在内存中
        setVisible(true);
    }
}

问题

  • 不能关闭窗口,关闭窗口只能停止程序运行。
  • 解决:
// 监听事件,监听窗口关闭事件 System.exit(0);
// 适配器模式:
frame.addWindowListener(new WindowAdapter() {
    //窗口点击关闭时需要做的事情
    @Override
    public void windowClosing(WindowEvent e) {
        //结束程序
        System.exit(0);
    }
}
);

2、面板 Panel

/**
 * 面板 Panel,可以看做一个空间,但是不能单独存在
 */
public class PanelTest {
    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(170, 92, 77));

        // 设置 panel 坐标,相对于 frame
        panel.setBounds(100,100,250,250);
        panel.setBackground(new Color(66, 170, 66));

        frame.add(panel);

        frame.setVisible(true);

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

    }
}

3、布局管理器(setLayout)

流式布局

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

        //组件-按钮
        Button button1 = new Button("a");
        Button button2 = new Button("b");
        Button button3 = new Button("c");

        //设置为流式布局,默认是 FlowLayout.CENTER
//        frame.setLayout(new FlowLayout());
        frame.setLayout(new FlowLayout(FlowLayout.LEFT));

        frame.setSize(500,500);

        // 添加按钮
        frame.add(button1);
        frame.add(button2);
        frame.add(button3);

        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

东西南北中

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

        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(500,500);
        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

表格布局(Grid)

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

        Button button1 = new Button("b1");
        Button button2 = new Button("b2");
        Button button3 = new Button("b3");
        Button button4 = new Button("b4");
        Button button5 = new Button("b5");
        Button button6 = new Button("b6");

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

        frame.add(button1);
        frame.add(button2);
        frame.add(button3);
        frame.add(button4);
        frame.add(button5);
        frame.add(button6);

        frame.pack();

        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

练习

在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        Frame frame = new Frame("练习");
        //设置窗口大小
        frame.setSize(500,500);
        //设置窗口可见
        frame.setVisible(true);
        //监听事件
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.setLayout(new GridLayout(2,1));

        // 四个面板
        Panel panel1 = new Panel(new BorderLayout());
        Panel panel2 = new Panel(new BorderLayout());
        Panel panel3 = new Panel(new GridLayout(2,1));
        Panel panel4 = new Panel(new GridLayout(2,2));

        // 10 个按钮
        Button but1 = new Button("Button");
        Button but2 = new Button("Button");
        Button but3 = new Button("Button");
        Button but4 = new Button("Button");
        Button but5 = new Button("Button");
        Button but6 = new Button("Button");
        Button but7 = new Button("Button");
        Button but8 = new Button("Button");
        Button but9 = new Button("Button");
        Button but10 = new Button("Button");

        frame.add(panel1);
        frame.add(panel2);

        // 第一个面板内容
        panel1.add(but1,BorderLayout.EAST);
        panel1.add(but2,BorderLayout.WEST);
        panel1.add(panel3,BorderLayout.CENTER);

        // 第三个面板内容
        panel3.add(but3);
        panel3.add(but4);

        // 第二个面板内容
        panel2.add(but5,BorderLayout.EAST);
        panel2.add(but6,BorderLayout.WEST);
        panel2.add(panel4,BorderLayout.CENTER);

        // 第四个面板内容
        panel4.add(but7);
        panel4.add(but8);
        panel4.add(but9);
        panel4.add(but10);

    }
}

4、事件监听(ActionListener)

一个按钮,监听一个事件

public class ActionEventTest {
    public static void main(String[] args) {
        Frame frame = new Frame();
        Button button = new Button();
        // 适配器模式,事件监听
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("a");
            }
        });

        frame.add(button,BorderLayout.CENTER);
        frame.setSize(400,400);
        frame.setVisible(true);
        // 关闭窗口
        closeWindows(frame);
    }
    //关闭窗口方法
    private static void closeWindows(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

多个按钮,共享一个事件

public class ActionEventTest2 {
    public static void main(String[] args) {
        Frame frame = new Frame();
        Button button1 = new Button("start");
        Button button2 = new Button("stop");

        //定义事件触发了会返回的命令,如果不显示定义,则会返回e.getActionCommand() 获取的按钮信息
        button2.setActionCommand("Stop!");

        MyMonitor myMonitor = new MyMonitor();
        // 事件监听
        button1.addActionListener(myMonitor);
        button2.addActionListener(myMonitor);

        frame.add(button1,BorderLayout.NORTH);
        frame.add(button2,BorderLayout.SOUTH);
        frame.setSize(400,400);
        frame.setVisible(true);
        // 关闭窗口
        closeWindows(frame);
    }

    private static void closeWindows(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

class MyMonitor implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        //e.getActionCommand() 获取按钮信息
        System.out.println(e.getActionCommand());
    }
}

5、输入框 TestField 监听

public class TextFieldTest {
    public static void main(String[] args) {
        //在 main 方法中,只有启动
        new MyFrame();
    }
}

class MyFrame extends Frame{
    public MyFrame(){
        TextField textField = new TextField();
        add(textField);

        MyActionListener myActionListener = new MyActionListener();
        // 监听文本框输入的文字,按下回车,就会触发这个输入框的事件
        textField.addActionListener(myActionListener);

        // 设置替换编码
        textField.setEchoChar('*');

        pack();
        setVisible(true);

        closeWindows(this);
    }
    private static void closeWindows(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) {
        // 获取一些资源,返回的是一个对象
        TextField field = (TextField) e.getSource();
        // 获得输入框中的内容
        System.out.println(field.getText());
        // 按下回车键,就会清空输入框中的内容
        field.setText("");
    }
}

6、简易计算器

目前代码

/**
 * 简易计算器
 */
public class CalculatorTest {
    public static void main(String[] args) {
        new Calculator();
    }
}

//计算机类
class Calculator extends Frame{
    public Calculator() {
        // 3 个文本框
        TextField num1 = new TextField(10);//最多 10 个字符
        TextField num2 = new TextField(10);//最多 10 个字符
        TextField num3 = new TextField(10);//最多 10 个字符

        // 1个按钮
        Button button = new Button("=");
        button.addActionListener(new MyCalculatorListener(num1,num2,num3));//监听事件

        // 1个标签
        Label label = new Label("+");

        // 布局
        setLayout(new FlowLayout());

        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);

        closeWindows(this);
    }

    private static void closeWindows(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

//监听器类
class MyCalculatorListener implements ActionListener{
    // 获取三个变量
    private TextField num1, num2, num3;

    public MyCalculatorListener(TextField num1,TextField num2,TextField num3) {
        this.num1 = num1;
        this.num2 = num2;
        this.num3 = num3;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 1.获得加数与被加数
        double d1 = Double.parseDouble(num1.getText());
        double d2 = Double.parseDouble(num2.getText());

        // 2.将这个值 加法运算后,放入第三个框
        num3.setText(String.valueOf(d1 + d2));
        
        // 3.清除第一和第二个框
        num1.setText("");
        num2.setText("");
    }
}

完全改造为面向对象写法

/**
 * 简易计算器
 */
public class CalculatorTest {
    public static void main(String[] args) {
        new Calculator().loadFrame();
    }
}

//计算机类
class Calculator extends Frame{
    //属性
    TextField num1,num2,num3;
    Button button;
    Label label;

    //方法
    public void loadFrame(){
        // 3 个文本框
        num1 = new TextField(10);//最多 10 个字符
        num2 = new TextField(10);//最多 10 个字符
        num3 = new TextField(10);//最多 10 个字符
        // 1个按钮
        button = new Button("=");
        button.addActionListener(new MyCalculatorListener(this));//监听事件
        // 1个标签
        label = new Label("+");

        // 布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);

        closeWindows(this);
    }

    private static void closeWindows(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

//监听器类
class MyCalculatorListener implements ActionListener{
    // 组合,在一个类中组合另一个类,获取计算器类这个对象
    Calculator calculator = null;

    public MyCalculatorListener(Calculator calculator) {
        this.calculator = calculator;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 1.获得加数与被加数
        double d1 = Double.parseDouble(calculator.num1.getText());
        double d2 = Double.parseDouble(calculator.num2.getText());
        // 2.将这个值 加法运算后,放入第三个框
        calculator.num3.setText(String.valueOf(d1 + d2));
        // 3.清除第一和第二个框
        calculator.num1.setText("");
        calculator.num2.setText("");
    }
}

内部类写法(√)

  • 最大的好处就是,可以畅通无阻的访问外部的属性和方法!
/**
 * 简易计算器
 */
public class CalculatorTest {
    public static void main(String[] args) {
        new Calculator().loadFrame();
    }
}

//计算机类
class Calculator extends Frame{
    //属性
    TextField num1,num2,num3;
    Button button;
    Label label;

    //方法
    public void loadFrame(){
        // 3 个文本框
        num1 = new TextField(10);//最多 10 个字符
        num2 = new TextField(10);//最多 10 个字符
        num3 = new TextField(10);//最多 10 个字符
        // 1个按钮
        button = new Button("=");
        button.addActionListener(new MyCalculatorListener());//监听事件
        // 1个标签
        label = new Label("+");

        // 布局
        setLayout(new FlowLayout());

        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);

        closeWindows(this);
    }

    private static void closeWindows(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    //监听器内部类类
           private class MyCalculatorListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            // 1.获得加数与被加数
            double d1 = Double.parseDouble(num1.getText());
            double d2 = Double.parseDouble(num2.getText());

            // 2.将这个值 加法运算后,放入第三个框
            num3.setText(String.valueOf(d1 + d2));

            // 3.清除第一和第二个框
            num1.setText("");
            num2.setText("");
        }
    }
}

7、画笔(Paint)

public class PaintTest {
    public static void main(String[] args) {
        new MyPaint().loadFrame();
    }
}

class MyPaint extends Frame{

    public void loadFrame(){
        setBounds(100,100,700,800);
        setVisible(true);
        closeWindows(this);
    }

    /**
     * 画笔
     * @param g
     */
    @Override
    public void paint(Graphics g) {
        //画笔,需要有颜色,画笔可以画画
        g.setColor(Color.blue);
        g.drawOval(100,100,200,200);//空心圆
        g.fillOval(350,100,200,200);//实心圆

        g.setColor(Color.red);
        g.fillRect(100,350,200,100);//实心矩形

        //画笔用完,最好还原为最初的颜色(黑色)
        g.setColor(Color.black);
    }

    public void closeWindows(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

8、鼠标监听

在这里插入图片描述

/**
 * 鼠标监听事件
 */
public class MouseListenerTest {
    public static void main(String[] args) {
        new MyFrame("a").DrawPoint();
    }
}

/**
 * MyFrame 类
 */
class MyFrame extends Frame{
    //画画需要画笔,需要监听鼠标当前的位置,需要集合来存储点
    ArrayList points;

    public MyFrame(String title){
        super(title);
        setBounds(100,100,600,500);
        setVisible(true);
        closeWindows(this);
    }

    public void DrawPoint(){
        //存鼠标点击的点
        points =  new ArrayList<>();
        //鼠标监听器,是针对于这个窗口的
        this.addMouseListener(new MyMouseListener());
    }

    @Override
    public void paint(Graphics g) {
        //画画需要监听鼠标的事件
        //迭代器
        Iterator iterator = points.iterator();
        while (iterator.hasNext()){
            Point point = (Point) iterator.next();
            g.setColor(Color.blue);
            g.fillOval(point.x,point.y,10,10);
        }
    }

    //添加一个点到界面中
    public void addPointInFrame(Point point){
        points.add(point);
    }

    // 适配器模式,创建鼠标监听的私有内部类
    private class MyMouseListener extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            MyFrame myFrame = (MyFrame) e.getSource();
            //点击的时候,界面上就会出现一个点,这个点就是鼠标的点
            myFrame.addPointInFrame(new Point(e.getX(),e.getY()));
            //每次点击都刷新一次
            myFrame.repaint();
        }
    }

    private void closeWindows(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

9、窗口监听

/**
 * 窗口监听
 */
public class WindowTest {
    public static void main(String[] args) {
        new MyWindowFrame();
    }
}

class MyWindowFrame extends Frame{
    public MyWindowFrame(){
        setTitle("正在此窗口!");
        setBounds(100,100,500,500);
        setBackground(Color.blue);
        setVisible(true);
        this.addWindowListener(new WindowAdapter() {//匿名内部类
            @Override
            public void windowActivated(WindowEvent e) {
                MyWindowFrame myWindowFrame = (MyWindowFrame) e.getSource();
                myWindowFrame.setTitle("正在此窗口!");
            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("您点击了关闭!");
                setVisible(false);
                System.exit(0);
            }
        });
    }
}

10、键盘监听

/**
 * 键盘监听
 */
public class KeyListenerTest {
    public static void main(String[] args) {
        new MyKeListenerFrame();
    }
}

class MyKeListenerFrame extends Frame{
    public MyKeListenerFrame(){
        setBounds(100,100,500,500);
        setVisible(true);

        this.addKeyListener(new KeyAdapter() {
            //键盘按下
            @Override
            public void keyPressed(KeyEvent e) {
                //获得键盘按下的是哪一个键,当前所按下键的码
                int keyCode = e.getKeyCode();
                System.out.println(keyCode);
                if (keyCode == KeyEvent.VK_DOWN){
                    System.out.println("下键");
                }
            }
        });

        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                setVisible(false);
                System.exit(0);
            }
        });
    }
}
c void main(String[] args) {
        new MyKeListenerFrame();
    }
}

class MyKeListenerFrame extends Frame{
    public MyKeListenerFrame(){
        setBounds(100,100,500,500);
        setVisible(true);

        this.addKeyListener(new KeyAdapter() {
            //键盘按下
            @Override
            public void keyPressed(KeyEvent e) {
                //获得键盘按下的是哪一个键,当前所按下键的码
                int keyCode = e.getKeyCode();
                System.out.println(keyCode);
                if (keyCode == KeyEvent.VK_DOWN){
                    System.out.println("下键");
                }
            }
        });

        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                setVisible(false);
                System.exit(0);
            }
        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值