跟着大神学java第十五课,GUI编程(二)

继续(一)的内容
查看上篇内容:
跟着大神学java第十五课,GUI编程(一):
https://blog.csdn.net/weixin_42681553/article/details/121356227
跟着大神学java第十五课,GUI编程(三):
https://blog.csdn.net/weixin_42681553/article/details/121682018

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);

        //监听文本框输入的文字
        //按下回车即可触发这个事件
        MyActionListener2 myActionListener2 = new MyActionListener2();
        textField.addActionListener(myActionListener2);

        //设置替换编码,输入看不到,打到控制台中,显示输入内容
        textField.setEchoChar('*');

        //设置属性
        setVisible(true);
        pack();

        //关闭窗口
        close(this);
    }

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

class MyActionListener2 implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        //获得一些资源,e.getSource() 对象为 object 类型,需要强转
        TextField textField = (TextField) e.getSource();
        System.out.println(textField.getText());    //获得输入框中的文本
        //回车获取内容显示到控制台后,清空输入框
        textField.setText("");
    }
}

2.6、简易计算器,组合+内部类回顾

oop原则:组合,大于继承!

class A {
    public B b;
}

加法计算器

1+1=2

分析:三个数字,前两个输入,点击等号按钮,输出结果为第三个数,并清空前两个数,加号不修改

面向过程

//简易计算器
public class TestCalc {
    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(20); //  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);

        close(this);
    }

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

//监听器类
class MyCalculatorListener implements ActionListener{
    //获取三个变量
    private TextField num1;
    private TextField num2;
    private TextField 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.获得加数和被加数,String转Int
        int n1 = Integer.parseInt(num1.getText());
        int n2 = Integer.parseInt(num2.getText());

        //2.将值加法运算后,放入第三个数
        num3.setText((n1+n2)+"");

        //3.清除前两个框
        num1.setText("");
        num2.setText("");
    }
}

改造为面向对象

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

//计算器类
class Calculator extends Frame{
    //属性
    TextField num1, num2, num3;
    //方法
    public void loadFrame(){
        num1 = new TextField(10); //  10表示最大字符数
        num2 = new TextField(10); //  10表示最大字符数
        num3 = new TextField(20); //  10表示最大字符数

        Button button = new Button("=");
        Label label = new Label("+");
        button.addActionListener(new MyCalculatorListener(this));

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

        pack();
        setVisible(true);

        close(this);
    }

    public Calculator() {
        close(this);
    }

    public static void close(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.获得加数和被加数,String转Int
        //2.将值加法运算后,放入第三个数
        //3.清除前两个框
        int n1 = Integer.parseInt(calculator.num1.getText());
        int n2 = Integer.parseInt(calculator.num2.getText());

        calculator.num3.setText(""+(n1+n2));
        calculator.num1.setText("");
        calculator.num2.setText("");
    }
}

内部类

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

//计算器类
class Calculator extends Frame{
    //属性
    TextField num1, num2, num3;
    //方法
    public void loadFrame(){
        num1 = new TextField(10); //  10表示最大字符数
        num2 = new TextField(10); //  10表示最大字符数
        num3 = new TextField(20); //  10表示最大字符数

        Button button = new Button("=");
        Label label = new Label("+");
        button.addActionListener(new MyCalculatorListener());

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

        pack();
        setVisible(true);

        close(this);

    }

    //监听器类(内部类)
    //最大的好处就是,可以畅通无阻地访问外部的属性和方法
    private class MyCalculatorListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            //1.获得加数和被加数,String转Int
            //2.将值加法运算后,放入第三个数
            //3.清除前两个框
            int n1 = Integer.parseInt(num1.getText());
            int n2 = Integer.parseInt(num2.getText());

            num3.setText(""+(n1+n2));
            num1.setText("");
            num2.setText("");
        }
    }

    //其他方法:关闭窗口按钮(可省略)
    public Calculator() {
        close(this);
    }

    //关闭窗口按钮(可省略)
    public static void close(Frame frame) {
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

2.7、画笔

通过代码自动生成画

//画笔
public class TestPaint {
    public static void main(String[] args) {
        new MyPaint().loadFrame();
    }
}

class MyPaint extends Frame{
    public void loadFrame(){
        setBounds(200,200,700,500);
        setVisible(true);

        close(this);
    }
    //画笔
    @Override
    public void paint(Graphics g) {
//        super.paint(g);
        g.setColor(Color.CYAN);
//        g.drawOval(100,100,100,100);  //空心的圆
        g.fillOval(100,100,100,100);  //实心的圆

        g.setColor(Color.green);
        g.fillRect(150,200,200,200);//矩形

        //养成习惯,画笔用完,将他还原到最初的颜色(黑色)
        g.setColor(Color.BLACK);
    }

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

2.8、鼠标监听事件

目的:实现鼠标画画

//监听鼠标事件,实现画图
public class TestMouseListener {
    public static void main(String[] args) {
        new MyFrame("画图");
    }
}

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

    public MyFrame(String title) {
        //1.设置窗口名称和画面
        super(title);
        setBounds(200,200,400,300);
        //存储鼠标点击的点位置
        points = new ArrayList<>();

        //2.鼠标监听器,监听画图窗口
        this.addMouseListener(new MyMouseListener());

        setVisible(true);
        close(this);
    }

    //2.监听事件的内容,需要获取鼠标位置传到数组中,用来增加点
    //通过继承不需要重写全部的方法,适配器模式 MouseAdapter
    private class MyMouseListener extends MouseAdapter {
        //鼠标按下事件
        @Override
        public void mousePressed(MouseEvent e) {
            //2.1  e是鼠标所有事件,可以拿到鼠标位置,放入Frame大类中的数组里,需要强转
            MyFrame myFrame = (MyFrame) e.getSource();

            //2.2 在e中过去的鼠标位置,写入到数组中
            //点击鼠标按压时,在画面上画出一个点
            //获取鼠标位置画点
            myFrame.points.add(new Point(e.getX(),e.getY()));

            //第一遍刚加载,数组为空,监听鼠标事件画图无内容,再次点击,point方法不会再次执行,所以需要 myFrame.repaint() 刷新页面
            //每次点击鼠标,都需要重新画一遍
            myFrame.repaint();
        }
    }

    //3.在数组中通过迭代器,获取点的位置并画出
    @Override
    public void paint(Graphics g) {
        //画画,需要监听鼠标的事件
        Iterator iterator = points.iterator();      //迭代器,不建议使用for循环
        while (iterator.hasNext()){     //判断数组中还有值,则继续画点
            Point point = (Point) iterator.next();
            g.setColor(Color.BLACK);
            g.fillOval(point.x,point.y,10,10);
        }
    }

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

2.9、窗口监听事件

public class TestWindow {
    public static void main(String[] args) {
        new WindowFrame();
    }
}

class WindowFrame extends Frame{
    public WindowFrame() {
        setBackground(Color.CYAN);
        setBounds(100,100,200,200);
        setVisible(true);

        //搭配内部类调用使用
//        addWindowListener(new MyWindowsListerner());

        this.addWindowListener(
            //匿名内部类
            new WindowAdapter() {
                //窗口关闭中
                @Override
                public void windowClosing(WindowEvent e) {
                    System.out.println("windowClosing");
                    System.exit(0);
                }
                //窗口激活(鼠标焦点重新回到当前窗口)
                @Override
                public void windowActivated(WindowEvent e) {
                    System.out.println("windowActivated");
                }
        });
    }

    //内部类,不建议使用,建议使用匿名内部类
//    class MyWindowsListerner extends WindowAdapter{
//        @Override
//        public void windowClosing(WindowEvent e) {
//            setVisible(false);  //隐藏窗口,通过按钮
//            System.exit(0); //正常退出
//        }
//    }
}

2.10、键盘监听事件

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

class KeyFrame extends Frame{
    public KeyFrame() {
        setBounds(0,0,300,400);
        setVisible(true);

        this.addKeyListener(new KeyAdapter() {
            //键盘按下
            @Override
            public void keyPressed(KeyEvent e) {
                //获取键盘按下的键
                int keyCode = e.getKeyCode();
                System.out.println(keyCode);    //int类型展示,使用时通过静态属性(例:VK_UP)调用
                //判断按上时触发
                if (keyCode == KeyEvent.VK_UP){
                    System.out.println("向上");
                }
            }
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值