Java GUI编程(一)AWT

GUI是什么?

GUI怎么用?

组件:

  窗口

  弹窗

  面板

  文本框

  列表框

  按钮

  图片

  监听事件

  鼠标

  键盘事件

 这其实就是一个GUI

1,简介:

GUI核心技术:Swing   AWT

但是他不流行因为界面不美观,需要jre环境!

为什么要学习?

1.可以写出自己心中想要的一些小工具

2.工作的时候,也可能需要维护到Swing界面

3.了解MVC架构,了解监听!

 

2,AWT

2.1AWT介绍

  1.包含了很多的类和接口!GUI:图形用户编程

  2.包含很多元素,窗口,按钮,文本框。

  3.java.awt包中

 

 2.2组件和容器

2.2.1frame

 现在我们将此弹窗方法封装起来,设置多次窗口弹出

 但是写完后发现,窗口是没法关闭的,只能通过结束程序,这个将在下面介绍监听时学习。

2.2.2面板Panel

 其中红色部分就是内嵌在窗口的一个面板

 

2.3布局管理器

  一,流式布局

 

  二,东南西北中

 

  三,表格布局

至此我们完成一个小练习,完成下列图形:

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

        //分为两行一列
        frame.setLayout(new GridLayout(2,1));
        //4个面板
        //第一行分东西中
        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));

        //p1放按钮
        //p1东西放按钮
        p1.add(new Button("east1"),BorderLayout.EAST);//
        p1.add(new Button("west1"),BorderLayout.WEST);//西
        //p2两行放按钮
        p2.add(new Button("button1"));
        p2.add(new Button("button2"));
        //p1中放按钮,即p1中放p2
        p1.add(p2,BorderLayout.CENTER);

        //p3放按钮
        //p3东西放按钮
        p3.add(new Button("east2"),BorderLayout.EAST);//
        p3.add(new Button("west2"),BorderLayout.WEST);//西
        //p3两行两列放按钮
        p4.add(new Button("button3"));
        p4.add(new Button("button4"));
        p4.add(new Button("button5"));
        p4.add(new Button("button6"));
        //p3中放按钮,即p3中放p4
        p3.add(p4,BorderLayout.CENTER);

        //将面板放入总frame
        frame.add(p1);
        frame.add(p3);
    }
}

 

 

 2.4事件监听

事件监听就是当某个事情发生的时候,干什么事情。

这里就是我们点击按钮会输出aaa。

 

下面拓展一下,两个甚至多个按钮能不能共用一个事件呢?如果每个按钮写一个会比较繁琐。

public class TestActionEventS {
    public static void main(String[] args) {
        Frame frame = new Frame("开始,停止");
        Button button1 = new Button("start");
        Button button2 = new Button("stop");

        MyAction myAction = new MyAction();
        //这里可以定义按钮的信息
        button2.setActionCommand("buttton2---stop");
        button1.addActionListener(myAction);
        button2.addActionListener(myAction);
        frame.add(button1,BorderLayout.NORTH);
        frame.add(button2,BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }
}

class MyAction implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        //这里就拿到了上面定义的按钮的信息
        System.out.println("msg==>"+e.getActionCommand());
    }
}

 

 我们可以看到,我们在button2上添加了额外的信息,那么在事件中点击输出的就是额外的信息,

在button1中只有默认定义的start,在事件中点击输出的就是默认的start。以此推断可以让多个按钮

共用一个事件。

 

2.5输入框TextField监听

在输入框中加入监听,输入什么回车输出什么。

public class TestText01 {
    public static void main(String[] args) {
        new MyFrame();//启动
    }
}
class MyFrame extends Frame{
    public MyFrame(){
        TextField textField = new TextField();
        add(textField);
        //监听文本框输入的文字
        textField.addActionListener(new Action());
        pack();
        setVisible(true);
    }
}
class Action implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        TextField field = (TextField) e.getSource();//获得一些资源,返回一个对象
        System.out.println(field.getText());//获得输入框的文本
    }
}

 

2.6简易计算器

我们先来回顾一下oop,在oop中,组合大于继承!

一个简易的加法计算器,如下图

public class TextCalculator {
    public static void main(String[] args) {
        new Calculator();
    }
}
//计算器类
class Calculator extends Frame{
    public Calculator(){
        //三个文本框
        TextField num1 = new TextField(10);
        TextField num2 = new TextField(10);
        TextField num3 = new TextField(20);
        //一个按钮
        Button button = new Button("=");
        //button加监听
        button.addActionListener(new CalculatorListener(num1,num2,num3));
        //一个标签
        Label label = new Label("+");
        //布局
        setLayout(new FlowLayout());
        //添加
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);
    }
}
//监听器类
class CalculatorListener implements ActionListener{
    //获取三个变量
    private TextField num1,num2,num3;
    public CalculatorListener(TextField num1,TextField num2,TextField num3){
        this.num1=num1;
        this.num2=num2;
        this.num3=num3;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获得加数和被加数
        int n1 = Integer.parseInt(num1.getText());
        int n2 = Integer.parseInt(num2.getText());
        //将这个加法运算后,放到第三个框
        num3.setText(""+(n1+n2));
        //清除前两个框
        num1.setText("");
        num2.setText("");
    }
}

 

2.7画笔paint

通过画笔画一些图形等等

 

2.8鼠标监听

目的:实现鼠标画画

 

 

public class TestMouseListener {
    public static void main(String[] args) {
        new MyMouseFrame("画图");
    }
}
//自己的类
class MyMouseFrame extends Frame{
    //画画需要画笔,需要监听鼠标当前位置,需要集合来存储这个点
    ArrayList points;
    public MyMouseFrame (String title){
        super(title);
        setBounds(200,200,400,300);
        //存鼠标点击的点
        points = new ArrayList<>();
        //添加鼠标监听器,正对这个窗口
        this.addMouseListener(new MyMouseListener());
        setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        //画画,监听鼠标事件
        Iterator iterator = points.iterator();
        while (iterator.hasNext()){
            Point point = (Point) iterator.next();
            g.setColor(Color.RED);
            g.fillOval(point.x,point.y,10,10);
        }
    }
    public void addPoint(Point point){
        points.add(point);
    }

    private class MyMouseListener extends MouseAdapter{
        //鼠标点击,按下,弹起,按住不放

        @Override
        public void mousePressed(MouseEvent e) {
            MyMouseFrame myMouseFrame =(MyMouseFrame) e.getSource();
            myMouseFrame.addPoint(new Point(e.getX(),e.getY()));
            //new Point(e.getX(),e.getY());//这个点就是鼠标的点
            //每次点击鼠标重画一遍
            myMouseFrame.repaint();//刷新
        }
    }
}

 

2.9窗口监听

关闭窗口

  

 

 右边是左边的优化,右边采用匿名内部类。

 

2.10键盘监听

 

posted on 2022-09-27 17:42  键盘敲烂的朱  阅读(153)  评论(0编辑  收藏  举报