GUI(图形用户界面)之事件处理

Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的鼠标单击、按下键盘等操作。在Swing事件处理的过程中,主要涉及三类对象:

1、事件源:事件发生的场所,通常是产生事件的组件,如窗口、按钮、菜单等。

2、事件对象:封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。

3、监听器:负责监听事件源上发生的事件,并对各种事件做出相应处理(监听器对象中包含事件处理器)。

 实现Swing事件处理的主要步骤如下:

1、创建事件源:除了一些常见的按钮、键盘等组件可以作为事件源外,还可以使用JFrame窗口在内的顶级容器作为事件源。

2、自定义事件监听器:根据要监听的事件源创建指定类型的监听器进行事件处理。监听器是一个特殊的java类,必须实现XxxListener接口。根据组件触发的动作进行区分,例如,WindowListener用于监听窗口事件,ActionListener用于监听动作事件。

3、为事件源注册监听器:使用addXxxListener()方法为指定事件源添加特定类型的监听器。当事件源上发生监听事件后,就会触发绑定的事件监听器,由监听器中的方法对事件进行相应处理。

 Swing常用事件处理有:窗体事件、鼠标事件、键盘事件、动作事件等。本文主要针对鼠标事件实现一个登录、退出的窗体操作。

 鼠标事件:

在图形用户界面中,用户会经常使用鼠标进行选择、切换界面等操作,这些操作被定义为鼠标事件,包括鼠标按下、鼠标松开、鼠标单击等。java提供了一个MouseEvent类描述鼠标事件。处理鼠标事件时,首先需要通过实现MouseListener接口定义监听器(也可以通过继承适配器MouseAdapter类定义监听器),然后调用addMouseListener()方法将监听器绑定到事件源对象。

 鼠标事件案例一:通过实现MouseListener接口定义监听器来实现登录、退出操作

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class GUI_3事件处理 {
    public static void main(String[] args) {
        guitext1 gt=new guitext1();

    }
}
//创建一个鼠标监听类实现监听接口
class guitext1 implements MouseListener {
        JFrame jf;
        JPanel jp;
        JLabel l1,l2;
        JTextField f1,f2;
        JButton jb1,jb2;
        public guitext1() {
            jf = new JFrame("登录窗口");
            jf.setBounds(300, 200, 350, 300);
            jp = new JPanel();
            Font font = new Font("仿宋", Font.BOLD, 20);
            l1 = new JLabel("用户名:");
            l1.setFont(font);
            f1 = new JTextField("请输入用户名!",20);
            f1.setFont(font);
            l2 = new JLabel("密  码:");
            l2.setFont(font);
            f2 = new JTextField("请输入密码!",20);
            f2.setFont(font);
            jb1 = new JButton("登录");
            jb1.setFont(font);
            jb1.addMouseListener(this);//登录按钮注册监听器
            jb2 = new JButton("退出");
            jb2.setFont(font);
            jb2.addMouseListener(this);//退出按钮注册监听器
            jp.add(l1);
            jp.add(f1);
            jp.add(l2);
            jp.add(f2);
            jp.add(jb1);
            jp.add(jb2);
            jf.add(jp);
            jf.setVisible(true);
        }
        //这些方法可以不写,但是必须要创建
        @Override
        public void mousePressed(MouseEvent e) {

        }
        @Override
        public void mouseReleased(MouseEvent e) {

        }
        @Override
        public void mouseEntered(MouseEvent e) {

        }
        @Override
        public void mouseExited(MouseEvent e) {

        }
        //鼠标点击事件
        //mouseClicked==>在组件上单击(按下并释放)鼠标按钮时调用。
        @Override
        public void mouseClicked(MouseEvent e) {
            //getSource()==>得到事件源
            if(e.getSource().equals(jb1)) {
                if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
                    //showMessageDialog==>提供一个名为“消息”的信息消息对话框。
                    JOptionPane.showMessageDialog(null, "登录成功!");
                }else{
                    JOptionPane.showMessageDialog(null, "登录失败,请重新输入!");
                    //将文本清空
                    f1.setText(null);
                    f2.setText(null);
                }
            }//getSource()==>得到事件源
            if(e.getSource().equals(jb2)) {
                JOptionPane.showMessageDialog(null, "退出成功!");
                //关闭当前窗口
                //jf.dispose();
                //系统退出
                System.exit(0);
            }
        }
    }

 案例二:通过继承适配器MouseAdapter类定义监听器来实现登录、退出操作

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class GUI_3事件处理2 {
        public static void main(String[] args) {
            guitext2 gt=new guitext2();
        }
    }
    class guitext2{
        JFrame jf;
        JPanel jp;
        JLabel l1,l2;
        JTextField f1,f2;
        JButton jb1,jb2;
        public guitext2() {
            jf = new JFrame("登录窗口");
            jf.setBounds(300, 200, 350, 300);
            jp = new JPanel();
            Font font = new Font("仿宋", Font.BOLD, 20);
            l1 = new JLabel("用户名:");
            l1.setFont(font);
            //输入用户名,JTextField==>允许编辑单行文本,显示原始字符
            f1 = new JTextField(null,20);
            f1.setFont(font);
            l2 = new JLabel("密  码:");
            l2.setFont(font);
            //f2 = new JTextField("请输入密码!",20);
            //JPasswordField是一个轻量级组件,允许编辑单行文本,其中视图指示输入的内容,但不显示原始字符。
            f2=new JPasswordField(null,20);
            f2.setFont(font);
            jb1 = new JButton("登录");
            jb1.setFont(font);
            //为按钮添加(注册)自定义鼠标监听事件监听器,并将f1,f2传入
            guitext2_1 gt=new guitext2_1(f1,f2);
            jb1.addMouseListener(gt);
            jb2 = new JButton("退出");
            jb2.setFont(font);
            jb2.addMouseListener(gt);
           // jb2.addMouseListener(new guitext2_1());//另一种写法
            jp.add(l1);
            jp.add(f1);
            jp.add(l2);
            jp.add(f2);
            jp.add(jb1);
            jp.add(jb2);
            jf.add(jp);
            jf.setVisible(true);
        }
    }
    //自定义一个鼠标监听类
//MouseAdapter==>用于接收鼠标事件的抽象适配器类
    class guitext2_1 extends MouseAdapter {
        //将f1,f2传入
        JTextField f1,f2;
        public guitext2_1(JTextField f1, JTextField f2) {
            this.f1 = f1;
            this.f2 = f2;
        }
        //mouseClicked==>在组件上单击(按下并释放)鼠标按钮时调用。
        public void mouseClicked(MouseEvent e) {
            //getSource()==>得到事件源
            JButton jButton=(JButton)e.getSource();
            if(jButton.getText().equals("登录")){
                if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
                    JOptionPane.showMessageDialog(null, "登录成功!");
                }else{
                    //showMessageDialog==>提供一个名为“消息”的信息消息对话框。
                    JOptionPane.showMessageDialog(null, "登录失败!");
                    //将文本清空
                    f1.setText(null);
                    f2.setText(null);
                }
            }
            if(jButton.getText().equals("退出")){
                JOptionPane.showMessageDialog(null, "退出成功!");
                //系统退出
                System.exit(0);
            }
        }
    }

 案例三:内部类

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GUI_3事件处理2 {
    public static void main(String[] args) {
        guitext2 gt=new guitext2();

    }
}
class guitext2{
    JFrame jf;
    JPanel jp;
    JLabel l1,l2;
    JTextField f1,f2;
    JButton jb1,jb2;
    public guitext2() {
        jf = new JFrame("登录窗口");
        jf.setBounds(300, 200, 350, 300);
        jp = new JPanel();
        Font font = new Font("仿宋", Font.BOLD, 20);
        l1 = new JLabel("用户名:");
        l1.setFont(font);
        //输入用户名,JTextField==>允许编辑单行文本,显示原始字符
        f1 = new JTextField(null,20);
        f1.setFont(font);
        l2 = new JLabel("密  码:");
        l2.setFont(font);
        //f2 = new JTextField("请输入密码!",20);
        //JPasswordField是一个轻量级组件,允许编辑单行文本,其中视图指示输入的内容,但不显示原始字符。
        f2=new JPasswordField(null,20);
        f2.setFont(font);
        jb1 = new JButton("登录");
        jb1.setFont(font);
        //为按钮添加(注册)自定义鼠标监听事件监听器
        guitext2_1 gt=new guitext2_1();
        jb1.addMouseListener(gt);
        jb2 = new JButton("退出");
        jb2.setFont(font);
        jb2.addMouseListener(gt);
        jb2.addMouseListener(new guitext2_1());//另一种写法
        jp.add(l1);
        jp.add(f1);
        jp.add(l2);
        jp.add(f2);
        jp.add(jb1);
        jp.add(jb2);
        jf.add(jp);
        jf.setVisible(true);
    }
 //内部类
//MouseAdapter==>用于接收鼠标事件的抽象适配器类
    class guitext2_1 extends MouseAdapter {
        //mouseClicked==>在组件上单击(按下并释放)鼠标按钮时调用。
        public void mouseClicked(MouseEvent e) {
            //getSource()==>得到事件源
            JButton jButton=(JButton)e.getSource();
            if(jButton.getText().equals("登录")){
                if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
                    JOptionPane.showMessageDialog(null, "登录成功!");
                }else{
                    //showMessageDialog==>提供一个名为“消息”的信息消息对话框。
                    JOptionPane.showMessageDialog(null, "登录失败!");
                    //将文本清空
                    f1.setText(null);
                    f2.setText(null);
                }
            }
            if(jButton.getText().equals("退出")){
                JOptionPane.showMessageDialog(null, "退出成功!");
                //系统退出
                System.exit(0);
            }
        }
    }
}

 案例四:匿名内部类

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GUI_3事件处理3 {
    public static void main(String[] args) {
        guitext3 gt=new guitext3();

    }
}
class guitext3{
    JFrame jf;
    JPanel jp;
    JLabel l1,l2;
    JTextField f1,f2;
    JButton jb1,jb2;
    public guitext3() {
        jf = new JFrame("登录窗口");
        jf.setBounds(300, 200, 350, 300);
        jp = new JPanel();
        Font font = new Font("仿宋", Font.BOLD, 20);
        l1 = new JLabel("用户名:");
        l1.setFont(font);
        //输入用户名,JTextField==>允许编辑单行文本,显示原始字符
        f1 = new JTextField(null,20);
        f1.setFont(font);
        l2 = new JLabel("密  码:");
        l2.setFont(font);
        //f2 = new JTextField("请输入密码!",20);
        //JPasswordField是一个轻量级组件,允许编辑单行文本,其中视图指示输入的内容,但不显示原始字符。
        f2=new JPasswordField(null,20);
        f2.setFont(font);
        jb1 = new JButton("登录");
        //匿名内部类
        jb1.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
                    JOptionPane.showMessageDialog(null, "登录成功!");
                }else{
                    //showMessageDialog==>提供一个名为“消息”的信息消息对话框。
                    JOptionPane.showMessageDialog(null, "登录失败!");
                    //将文本清空
                    f1.setText(null);
                    f2.setText(null);
                }
            }
        });
        jb1.setFont(font);
        jb2 = new JButton("退出");
        //匿名内部类
        jb2.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                JOptionPane.showMessageDialog(null, "退出成功!");
                //系统退出
                System.exit(0);
            }
        });
        jb2.setFont(font);
        jp.add(l1);
        jp.add(f1);
        jp.add(l2);
        jp.add(f2);
        jp.add(jb1);
        jp.add(jb2);
        jf.add(jp);
        jf.setVisible(true);
    }
}

 其实这些是由复杂的代码逐渐简化的过程。

我突然发现其中的JPanel还没有给大家解读过,所以在这里插入一下这个小知识:

JPanel面板组件是一个无边框且不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是FlowLayout。也可以使用JPanel带参数的构造函数JPanel(LayoutManager layout)或者setLayout()成员方法设置JPanel布局管理器。JPanel也被称为中间容器。

你可能感兴趣的