Java——GUI(图形用户界面设计)

事件处理:
    事件:用户的一个操作(例如:点击一下鼠标,或者敲击一下键盘)
    事件源:被操作的组件(例如:在一个窗体中的一个按钮,那个按钮就属于被操作的组件,按钮就是事件源)
    监听器:一个自定义的对象,实现了监听接口,包含事件处理方式,把监听器添加在事件源上,当事件发生的时候,虚拟机就会自动调用监听器中的事件处理方法
package com.yy.gui;
//GUI功能简单运用
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Demo1_Frame {

    public static void main(String[] args) {
        Frame f = new Frame("琪老师好!");
        f.setSize(400,600);                         //设置窗体大小(宽和高)
        f.setLocation(500, 50);                     //设置窗体初始的位置
        f.setIconImage(Toolkit.getDefaultToolkit().createImage("beyond.jpg"));
        Button b1 = new Button("我就不~不滚咋滴!!!"); //设置按钮1,按钮名称:我就不~不滚咋滴!!!
        Button b2 = new Button("略略略");              //设置按钮2,按钮名称:略略略
        f.add(b1);
        f.add(b2);
        f.setLayout(new FlowLayout());              //设置布局管理器
        //f.addWindowListener(new MyWindowAdapter());//WindowListenter是一个接口,不能直接new一个接口,但是我们可以传这个接口的子类对象


        /*
        //窗体监听
        //优化2,匿名内部类
        //public void windowClosing(WindowEvent e)窗口正处在关闭过程中时调用。此时可重写关闭操作

        f.addWindowListener(new WindowAdapter(){    //WindowListener是一个接口,找个类去实现这个接口,重写接口中的所有方法,然后去调用自己想要的方法,继承WindowAdapter这个类
        //不能new接口,但是可以new这个接口的子类对象
            public void windowClosing(WindowEvent e){   //重写所需要的方法
                System.exit(0);
            }
        });

        //new WindowAdapter(){}
        //new      类                 (){}  表示去继承这个类
        */



        /*
        //鼠标监听,鼠标点击进行指定操作
        //public void mouseClicked(MouseEvent e)鼠标按键在组件上单击(按下并释放)时调用
        //public void mouseReleased(MouseEvent e)鼠标按钮在组件上释放时调用

        b1.addMouseListener(new MouseAdapter(){     //匿名内部类,添加一个鼠标监听,鼠标适配器


            public void mouseClicked(MouseEvent e){//单击Clicked
                System.exit(0);                     //退出
            }

            public void mouseReleased(MouseEvent e){//释放Released    
                System.exit(0);
            }

        });
        */  



        /*
        //键盘监听以及键盘事件(满足某种条件就去执行对应的方法)
        //public int getKeyCode()返回与此事件中的键关联的整数 keyCode
        //返回:   键盘上实际键的整数代码

        b1.addKeyListener(new KeyAdapter(){         //匿名内部类,添加一个键盘监听器
            public void keyReleased(KeyEvent e){    //KeyEvent  键盘事件
                //System.out.println(e.getKeyCode());   //打印键盘上的键所对应的整数值

                第一种形式
                if(e.getKeyCode() == 32){           //32对应的键是空格键
                    System.exit(0);                 //如果是空格键,退出程序
                }

                //第二种形式 
                if(e.getKeyCode() == KeyEvent.VK_SPACE){        //类名.  去调用这个静态常量就可以
                //KeyEvent.VK_SPACE
                //类名             .         VK_SPACE代表空格   VK_ENTER代表回车  ...
                    System.exit(0);                 //退出程序
                }
            }
        });                                         //KeyListener也是一个接口,
        */



        /*
        //动作监听
        b2.addActionListener(new ActionListener() {         //添加动作监听,应用场景就是暂停视频和播放视频

            @Override
            public void actionPerformed(ActionEvent e) {    //无论是敲空格键还是鼠标左键单击,都会退出java虚拟机,因为空格键还是鼠标左键单击是系统默认的
                System.exit(0);
            }
        });
        */



        f.setVisible(true);                         //设置窗体可见
    }

}

//WindowAdapter:适配器,也是一个抽象类,定义为抽象类是为了,不想让你去创建这个类的对象,因为,就算创建了这个类的对象,调用这个类的空方法也是没有任何意义的。
//该抽象类实现了WindowListener这个接口,并且重写了WindowListener这个接口中的所有的出抽象方法
//方便在于:如果以后你想用WindowListener这个接口,只需要继承WindowAdapter这个类就可以了,想用那个方法,就重写那个方法即可
//WindowAdapter该类中的方法都是空方法;
//目的在于:就是为了提供给子类去使用这些方法,而不是自己用的,然后,WindowAdapter这个类把这些方法都给重写了,当子类去使用的时候,想用哪个方法,就直接重写哪个方法即可



/*class MyWindowListener implements WindowListener{     //创建WindowListener这个抽象类的子类对象
//如果一个抽象类中,没有定义任何的抽象方法,那这个抽象类的作用只有一个,不允许其他的类来创建这个抽象类的对象
    @Override
    public void windowOpened(WindowEvent e) {           //重写WindowListener这个接口里面的所有方法
    }

    @Override
    public void windowClosing(WindowEvent e) {
        System.out.println("Closing");
        System.exit(0);
    }

    @Override
    public void windowClosed(WindowEvent e) {
        System.out.println("Closed");
    }

    @Override
    public void windowIconified(WindowEvent e) {
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
    }

    @Override
    public void windowActivated(WindowEvent e) {
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
    }

}
*/


/*
 优化1 
 class MyWindowAdapter extends WindowAdapter{               //创建一个类MyWindowAdapter去继承WindowAdapter(适配器)这个抽象类
//该抽象类实现了WindowListener这个接口,并且重写了WindowListener这个接口中的所有的出抽象方法,方便在于:如果以后你想用WindowListener这个接口,只需要继承WindowAdapter这个类就可以了,想用那个方法,就重写那个方法即可
//这里就不会去强制重写任何方法,用哪个重写哪个方法就可以 
    public void WindowClosing(WindowEvent e){               
        System.exit(0);
    }
}
*/
 * A:什么是适配器
 *      在使用监听器的时候,需要定义一个类事件监听器接口
 *      通常接口中有多个方法,而程序中不一定所有的都能用到,但有必须重写所有的方法,这很繁琐
 *      适配器简化了这些操作,我们定义监听器时只要继承适配器,然后重写需要的方法即可
 * B:适配器原理(Adapter就是一个适配器)
 *      适配器就是一个类,实现了监听器接口,所有的抽象方法都重写了,但是方法全是空的
 *      适配器类需要定义成抽象的,因为创建该类对象,调用空方法都是没有意义的
 *      目的就是为了简化程序员的操作,定义监听器时继承适配器,只重写需要的方法就可以了
 * 适配器设计模式
 * 例如:鲁智深(花和尚)。是个和尚(假如,和尚每天要做的事情为打坐、念经、撞钟、习武),现在有一个  和尚  接口,该接口有打坐、念经、撞钟、习武这四个方法,
 * 但是鲁智深只喜欢习武,所以,让鲁智深去实现  和尚  这个接口是不合适的
 * 首先有个接口  和尚 ,和尚 这个接口里面有一些方法打坐、念经、撞钟、习武
 * 而鲁智深只喜欢习武,所以,这时候,我们就可以创建一个中间类  天罡星 ,这个  天罡星  这个类实现了这个   和尚  接口,实现  和尚  这个接口之后,重写了  和尚  这个接口里面的所有抽象方法
 * 天罡星 这个类重写了  和尚  里面的所有抽象方法,这些抽象方法都是空的,为了防止别人拿这个  天罡星 这个类去创建对象,于是就把  天罡星 这个类给声明成抽象类
 * 把  天罡星  这个类声明成抽象类的原因:不想让其他类去创建本类对象,因为创建也是没有意义的,天罡星 这个类里面的方法都是空的,这里的  天罡星 这个类就起到一个过渡的作用
 * 然后,创建一个    鲁智深   类,让  鲁智深  这个类去继承  天罡星  这个抽象类,于是,鲁智深 这个类 想重写哪个方法就重写哪个方法就行了,由于鲁智深只想习武,于是只需要重写  习武  这个方法就行了
 * 然后,重写 习武 这个方法,输出倒拔垂杨柳,拳打镇关西,大闹野猪林...即可
 * 这时候,唐三藏来了,而他只喜欢打坐,念经,撞钟,但是他不喜欢习武,于是,就可以定义一个  唐三藏  类去继承  天罡星  这个抽象类  然后重写他需要的方法即可;

代码如下

package com.yy.适配器;

public class Demo1_Adapter {
    public static void main(String[] args) {
        鲁智深  yy = new 鲁智深();            //创建  鲁智深  这个类对象
        唐三藏 wsq = new 唐三藏();            //创建  唐三藏  这个类对象
        yy.习武();                           //调用  鲁智深  这个类中的  习武  方法

        wsq.念经();                          //调用  唐三藏  这个类中的  念经  方法
        wsq.打坐();                          //调用  唐三藏  这个类中的  打坐  方法
        wsq.撞钟();                          //调用  唐三藏  这个类中的  撞钟  方法
    }

}

interface 和尚{                               //定义一个 和尚  接口
    public void 打坐();                       //这些是  和尚 这个接口的所有抽象方法
    public void 念经();
    public void 撞钟();
    public void 习武();
}

//适配器设计模式
abstract class 天罡星 implements 和尚{       //声明成抽象类的原因是:不想让其他类去创建本类对象,因为创建也是没有意义的,方法都是空的
//这里的  天罡星  这个类就充当着适配器的作用,作为中间类
    @Override
    public void 打坐() {      //重写  和尚 这个接口里面的所有抽象方法,但是都是空方法,调用空方法是没有任何意义的
    }

    @Override
    public void 念经() {
    }

    @Override
    public void 撞钟() {
    }

    @Override
    public void 习武() {
    }

}
class 鲁智深 extends 天罡星{      //鲁智深  这个类去继承   天罡星  这个抽象类
    public void 习武() {
        System.out.println("倒拔垂杨柳");
        System.out.println("拳打镇关西");
        System.out.println("大闹野猪林");
        System.out.println("......");
    }
    //这里并没有重写toString方法,而是采用   类名.    的方法调用类中的每个方法
}
class 唐三藏 extends 天罡星{
    public void 打坐(){
        System.out.println("我佛慈悲");
    }
    public void 念经() {
        System.out.println("阿弥陀佛");
    }
    public void 撞钟() {
        System.out.println("duangduangduang");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/81295402
今日推荐