详解Java如何给按钮添加监视器

 更新时间:2023年04月07日 10:41:28   作者:CrazyDragon_King  
这篇文章主要介绍了详解Java如何给按钮添加监视器,使用匿名对象、实现接口、实现类、Lambda表达式、注解等,需要的朋友可以参考下

给按钮添加监视器

最近看了 java 相关方面的内容,正好总结一下,给按钮添加监视器的几种方式,当做是加深对知识的理解吧。

直接上代码吧!

第一种:匿名对象

界面代码

package dragon;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class View3 extends JFrame{
	private JButton submit, cancel;
	public View3() {
		this.init();
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(300,300,250,100);
		this.setVisible(true);
	}
	
	private void init() {
		submit = new JButton("确定");
		cancel = new JButton("取消");
		Box box = Box.createHorizontalBox();
		box.add(submit);
		box.add(Box.createHorizontalStrut(20));
		box.add(cancel);
		
		submit.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "点击了确定按钮", "确定", JOptionPane.INFORMATION_MESSAGE);
			}
		});
		
		cancel.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "点击了取消按钮", "取消", JOptionPane.CANCEL_OPTION);
			}
		});
		this.add(box);
	}
}

测试代码

package dragon;public class Test {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->public static void main(String[] args) {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->new View3();}}package dragon;

public class Test {
	public static void main(String[] args) {
		new View3();
	}
}

运行截图:

在这里插入图片描述

在这里插入图片描述

说明:比较常见的一种方式,初学Java的朋友一般都会见到这种方法,但是同时这也是很老的一种方式,不能很好的体现Java代码的变化。一般并不推荐使用这种方式,但是作为学习Java语法的例子,还是非常不错的

第二种:实现类

界面代码

package dragon;

import java.awt.FlowLayout;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;

public class View4 extends JFrame{
	private JButton submit, cancel;
	private SubmitListener submitListener;
	private CancelListener cancelListener;
	
	public View4() {
		this.init();
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(300,300,250,100);
		this.setVisible(true);
	}
	
	private void init() {
		submit = new JButton("确定");
		cancel = new JButton("取消");
		Box box = Box.createHorizontalBox();
		box.add(submit);
		box.add(Box.createHorizontalStrut(20));
		box.add(cancel);
		
		submitListener = new SubmitListener();
		cancelListener = new CancelListener();
		submit.addActionListener(submitListener);
		cancel.addActionListener(cancelListener);
		this.add(box);
	}
}

实现 ActionListener 接口的类

package dragon;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

public class SubmitListener implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent e) {
		JOptionPane.showMessageDialog(null, "点击了确定按钮", "确定", JOptionPane.INFORMATION_MESSAGE);
	}
}

class CancelListener implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent e) {
		JOptionPane.showMessageDialog(null, "点击了取消按钮", "取消", JOptionPane.CANCEL_OPTION);
	}
	
}

测试代码

package dragon;

public class Test {
	public static void main(String[] args) {
		new View4();
	}
}

运行截图:

在这里插入图片描述

在这里插入图片描述

说明:使用继承 ActionListener 接口的类,作为监视器,是一种很好的方式。

第三种:实现接口

界面代码

package dragon;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class View1 extends JFrame implements ActionListener{
	private JButton submit, cancel;
	public View1() {
		this.init();
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(300,300,250,100);
		this.setVisible(true);
	}
	
	private void init() {
		submit = new JButton("确定");
		cancel = new JButton("取消");
		Box box = Box.createHorizontalBox();
		box.add(submit);
		box.add(Box.createHorizontalStrut(20));
		box.add(cancel);
		
		
		submit.addActionListener(this);
		cancel.addActionListener(this);
		this.add(box);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == submit) {
			JOptionPane.showMessageDialog(null, "点击了确定按钮", "确定", JOptionPane.INFORMATION_MESSAGE);
		}
		if (e.getSource() == cancel) {
			JOptionPane.showMessageDialog(null, "点击了取消按钮", "取消", JOptionPane.CANCEL_OPTION);
		}
	}
	 
}

测试代码

package dragon;

public class Test {
	public static void main(String[] args) {
		new View1();
	}
}

运行截图

在这里插入图片描述

在这里插入图片描述

说明:这种方式和上面第二种差不多,但是我个人很喜欢这种,主要是少写了几个类。这也是一种很好的方式,主要是传递参数的方式,我以前对这个 submit.addActionListener(this); 很迷惑,哈哈。

第四种:Lambda 表达式

界面代码

package dragon;

import java.awt.FlowLayout;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class View extends JFrame{
	private JButton submit, cancel;
	public View() {
		this.init();
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(300,300,250,100);
		this.setVisible(true);
	}
	
	private void init() {
		submit = new JButton("确定");
		cancel = new JButton("取消");
		Box box = Box.createHorizontalBox();
		box.add(submit);
		box.add(Box.createHorizontalStrut(20));
		box.add(cancel);
		
		submit.addActionListener((e)->{
			JOptionPane.showMessageDialog(null, "点击了确定按钮", "确定", JOptionPane.INFORMATION_MESSAGE);
		});
		
		cancel.addActionListener((e)->{
			JOptionPane.showMessageDialog(null, "点击了取消按钮", "取消", JOptionPane.CANCEL_OPTION);
		});
		this.add(box);
	}
}

测试代码

package dragon;

public class Test {
	public static void main(String[] args) {
		new View();
	}
}

运行截图

在这里插入图片描述

在这里插入图片描述

说明:Lambda 表达式 是Java 8 的新特性,主要是简化了代码,这个可以理解为对第一种匿名对象方式的简化,主要是去除了很多的模板代码,从传递对象演进到传递行为(因为其它是多余的)。这个我现在比较喜欢使用,使用这种方法,可以少些很多的代码。当然了,它也是有不足的,使用 Lambda 表达式的前提是这个接口必须是函数式接口(接口中只有一个抽象方法),一般这种接口都会使用一个注解进行修饰:@FunctionalInterface

第五种:注解

界面代码

package dragon;

import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;


public class View5 extends JFrame{
	@ButtonListener(listener=SubmitListener.class)
	private JButton submit;
	
	@ButtonListener(listener=CancelListener.class)
	private JButton cancel;
	
	public View5() {
		this.init();
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(300,300,250,100);
		this.setVisible(true);
	}
	
	private void init() {
		submit = new JButton("确定");
		cancel = new JButton("取消");
		Box box = Box.createHorizontalBox();
		box.add(submit);
		box.add(Box.createHorizontalStrut(20));
		box.add(cancel);
		
		//处理注解的类对象
		ButtonProcess process;
		process = new ButtonProcess();
		try {
			process.addListener(this);
		} catch (Exception e) {
			//直接处理 Exception 异常
			e.printStackTrace();
		}
		
		this.add(box);
	}
}

注解处理类

package dragon;

import java.awt.event.ActionListener;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JButton;

public class ButtonProcess {
	public void addListener(Object ob) throws IllegalArgumentException, IllegalAccessException, NoSuchMethodException, SecurityException, InstantiationException, InvocationTargetException {
		Class<?> clazz = ob.getClass();
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			//访问私有的成员变量,必须设置访问权限
			field.setAccessible(true);
			Object object = field.get(ob);
			//获取成员变量的注解
			ButtonListener buttonListener = field.getDeclaredAnnotation(ButtonListener.class);
			//如果注解对象不为空(有的成员变量没有注解,所以该对象为 null),
			//并且 该成员变量所对应的对象的类型是JButton 类型(这里只有一个注解,可以不需要这个判断,
			//但是从代码的健壮性角度来说,应该加上,如果有多个注解,必须进行判断才行)。
			if (buttonListener != null && object != null && object instanceof JButton) {
				//获取注解的成员变量(必须经过判断之后才能,获取成员变量,注解对象可能为 null)
				Class<? extends ActionListener> listener = buttonListener.listener();
				Constructor<?> con = listener.getDeclaredConstructor(new Class[] {});
				ActionListener actionListener = (ActionListener) con.newInstance(new Object[] {});
			//	ActionListener actionListener = listener.newInstance();
				//给按钮对象添加监视器
				((JButton)object).addActionListener(actionListener);
			}
		}
	}
}

测试代码

package dragon;

public class Test {
	public static void main(String[] args) {
		new View5();
	}
}

注意:ActionListener actionListener = listener.newInstance(); 这句话被我注释了,因为在 Java 9中,Class 对象的 newInstance()废弃了,不再推荐使用了,但是这个ActionListener 是一个接口,接口是没有构造方法的,但是我使用反射的方式获取到了,因为接口也是类的一种,可能是含有 私有的构造方法。

运行截图:

在这里插入图片描述

在这里插入图片描述

说明:这种实现方式,是这里最复杂的,但是不能说它是最差的(不过速度应该是最慢的了,毕竟反射的速度是没有直接创建对象快的。),上面代码参考了疯狂Java讲义,但是加了一点我的注释,但是这是一种新的方式,毕竟我们不能永远只写一些很容易就看得懂的代码,也是需要学习新的知识,这个例子主要是学习如何使用注解的,可以看出来虽然很复杂,但是这也是很有趣的一种方式。

总结

使用上面五种方式实现了给按钮添加监视器,还是很有趣的。上面总结的这些例子,还是本身为了复习Java的知识,并且和新学习的只是做一个比较,这样学习的效果会比较好,添加监视器只是实现的一种方式。这里最重要的第五种方式,因为我这两天在学习注解的使用,一开始看注解很懵逼,现在感觉有点理解了,说明只要付出努力,还是会有点效果的。一起好好努力吧。

到此这篇关于详解Java如何给按钮添加监视器的文章就介绍到这了,更多相关Java按钮添加监视器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java进阶必备之多线程编程

    Java进阶必备之多线程编程

    今天带大家来学习java多线程编程,文中有非常详细的代码示例及介绍,对正在学习java多线程的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • SpringMVC 拦截器不拦截静态资源的三种处理方式方法

    SpringMVC 拦截器不拦截静态资源的三种处理方式方法

    本篇文章主要介绍了SpringMVC 拦截器不拦截静态资源的三种处理方式方法,详细的介绍了三种方法,有兴趣的可以了解一下。
    2017-01-01
  • SpringData @Query和@Modifying注解原理解析

    SpringData @Query和@Modifying注解原理解析

    这篇文章主要介绍了SpringData @Query和@Modifying注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 浅谈Java springboot日志管理

    浅谈Java springboot日志管理

    这篇文章主要介绍了浅谈Java springboot日志管理,文中有非常详细的代码示例,对正在学习Java的小伙伴们有很好的帮助哟,需要的朋友可以参考下
    2021-05-05
  • java 抽象类和接口的区别详细解析

    java 抽象类和接口的区别详细解析

    abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力,需要了解的朋友可以参考下
    2012-11-11
  • Java8 stream流的map()方法你会使用了吗

    Java8 stream流的map()方法你会使用了吗

    在日常的开发工作中经常碰到要处理list中数据的问题。本文主要带大家了解下Java8 stream流中map()方法的使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-12-12
  • java中应用Stack进行算术运算的操作

    java中应用Stack进行算术运算的操作

    这篇文章主要介绍了java中应用Stack进行算术运算的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • SpringBoot集成kafka全面实战记录

    SpringBoot集成kafka全面实战记录

    在实际开发中,我们可能有这样的需求,应用A从TopicA获取到消息,经过处理后转发到TopicB,再由应用B监听处理消息,即一个应用处理完成后将该消息转发至其他应用,完成消息的转发,这篇文章主要介绍了SpringBoot集成kafka全面实战,需要的朋友可以参考下
    2021-11-11
  • Eclipse下Javassist正确使用方法代码解析

    Eclipse下Javassist正确使用方法代码解析

    这篇文章主要介绍了Eclipse下Javassist正确使用方法代码解析,javassist-3.15.0-ga.jar包是一款在java开发中十分重要的jar文件包,需要的朋友可以参考下,文中附下载链接。
    2017-12-12
  • Spring Security方法鉴权的实现

    Spring Security方法鉴权的实现

    在Spring Security中,主要有两种鉴权方式,一个是基于web请求的鉴权,一个是基于方法的鉴权,本文就来介绍一下Spring Security方法鉴权的实现,感兴趣的可以了解一下
    2023-12-12

最新评论