Java深入学习图形用户界面GUI之事件处理(java图形界面GUI编程(持续更新))

网友投稿 286 2022-08-07


Java深入学习图形用户界面GUI之事件处理(java图形界面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("密 http:// 码:");

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

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{

http:// //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也被称为中间容器。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java深入学习图形用户界面GUI之布局管理器
下一篇:Java使用GUI实现贪吃蛇游戏详解(java开发贪吃蛇游戏)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~