`
朱凌峰
  • 浏览: 7382 次
文章分类
社区版块
存档分类
最新评论

通过内部类创建监听器的好处

阅读更多

 

      当我们为一个组件添加事件监听器的时候,常常需要写一个该监听器的实现类,在这个实现类内部写事件处理方法。 而其中比较麻烦的一点就是我们需要将事件源及其他一些参数传入到这个实现类中,而且在实现类中定义相应的属性来保存这些参数,以便在事件处理方法中使用。当需要传入的参数比较多时,这样的方法显然不太方便。

         通过内部类创建监听器则能比较好地解决这一问题。示例如下:

 

// 通过内部类创建滑条监听器
		jsR.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				// 调用本类内部的事件处理方法
				processEvent(jsR, "R", jtfR);
			}
		});

然后将所需传入的参数定义为全局变量,并写一个processEvent()方法即可 

// 将JSlider定义为属性,其对象可以在其他方法中使用
	private JSlider jsR, jsG, jsB;
	// 将JTextField定义为属性,其对象可以在其他方法中使用
	private JTextField jtfR, jtfG, jtfB;

 并写一个processEvent()方法即可 

private void processEvent(JSlider js, String color, JTextField jtf) {
		int value = js.getValue();
		System.out.println("当前js" + color + "的值为:" + value);

		String jtfColor = "" + value;

		if (color.equals("R")) {
			R = value;
			jtfR.setText(jtfColor);

		}
		if (color.equals("G")) {
			G = value;
			jtf.setText(jtfColor);

		}
		if (color.equals("B")) {
			B = value;
			jtf.setText(jtfColor);

		}

		// 根据当前RGB画画
		g.setColor(new Color(R, G, B));
		g.fillOval(400, 400, 200, 200);
		System.out.println("当前RGB的值为:" + "(" + R + "," + G + "," + B + ")");

	}

    下面是我的一个完整程序。其中用到了三个JSlider来调节RGB值并画图案相应颜色的圆,我只写了一个processEvent()方法, 根据其传入的参数color来判断为哪一个JSlider,并作相应操作。

    方法中最后一步是画出当前RGB值对应颜色的图形,需要对三个JSlider的值进行监听,通过全局变量比较好地解决了这一问题。一开始我试过用外部类创建事件监听器的方法,不但要创建三个实现类,而且要将三个监听器中的得到的RGB值传入到每个监听器中,再画出图形,相当麻烦!

   所以建议大家采用这种内部类创建监听器的方法。酷

 

 

 

package myColor20130711;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * @author zlf
 * 
 */
public class TestColor extends JFrame {

	public static void main(String[] args) {
		TestColor tc = new TestColor();
		tc.initGUI();

	}

	// 计数器
	private int count = 0;


	// 将JSlider定义为属性,其对象可以在其他方法中使用
	private JSlider jsR, jsG, jsB;
	// 将JTextField定义为属性,其对象可以在其他方法中使用
	private JTextField jtfR, jtfG, jtfB;

	// 颜色值
	private int R, G, B;
	// 画布
	private Graphics g;

	
	/**
	 * 事件发生时,调用处理方法
	 * 
	 * @param js
	 *            發生事件的JSlider
	 * @param color
	 *            发生事件的JSlider对应的颜色:R或G或B
	 * @param jtf
	 *            发生事件的JSlider对应的文本框
	 */
	private void processEvent(JSlider js, String color, JTextField jtf) {
		int value = js.getValue();
		System.out.println("当前js" + color + "的值为:" + value);

		String jtfColor = "" + value;

		if (color.equals("R")) {
			R = value;
			jtfR.setText(jtfColor);

		}
		if (color.equals("G")) {
			G = value;
			jtf.setText(jtfColor);

		}
		if (color.equals("B")) {
			B = value;
			jtf.setText(jtfColor);

		}

		// 根据当前RGB画画
		g.setColor(new Color(R, G, B));
		g.fillOval(400, 400, 200, 200);
		System.out.println("当前RGB的值为:" + "(" + R + "," + G + "," + B + ")");

	}

	/**
	 * 初始化界面方法
	 */
	public void initGUI() {
		this.setTitle("测试颜色");
		this.setSize(1000, 700);
		this.setDefaultCloseOperation(3);
		this.setResizable(true);
		this.setLocationRelativeTo(null);
		this.setLayout(new FlowLayout());
		/*************************** 第一个滑条 *************************************/

		jsR = new JSlider();
		jsR.setMaximum(255);
		jsR.setValue(0);
		jsR.setPreferredSize(new Dimension(500, 30));

		JLabel jlaR = new JLabel("R");

		jtfR = new JTextField(10);
		// 通过内部类创建滑条监听器
		jsR.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				// 调用本类内部的事件处理方法
				processEvent(jsR, "R", jtfR);
			}
		});

		this.add(jsR);
		this.add(jlaR);
		this.add(jtfR);
		/*************************** 第二个滑条 *************************************/
		jsG = new JSlider();
		jsG.setMaximum(255);
		jsG.setValue(0);
		jsG.setPreferredSize(new Dimension(500, 30));

		JLabel jlaG = new JLabel("G");

		jtfG = new JTextField(10);

		jsG.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				// 调用本类内部的事件处理方法
				processEvent(jsG, "G", jtfG);
			}
		});
		this.add(jsG);
		this.add(jlaG);
		this.add(jtfG);

		/*************************** 第三个滑条 *************************************/
		jsB = new JSlider();
		jsB.setMaximum(255);
		jsB.setValue(0);
		jsB.setPreferredSize(new Dimension(500, 30));

		JLabel jlaB = new JLabel("B");

		jtfB = new JTextField(10);

		jsB.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				// 调用本类内部的事件处理方法
				processEvent(jsB, "B", jtfB);
			}
		});
		this.add(jsB);

		this.add(jlaB);
		this.add(jtfB);

		this.setVisible(true);
		g = this.getGraphics();

	}

}

 

 

 

分享到:
评论

相关推荐

    匿名内部类作为事件监听器

    定义一个按钮bn,并通过创建匿名内部类实现事件监听bn是否被按下。

    Android编程之监听器的实现方法

    第二步:创建监听器对象 第三步:注册 以一个button为例,代码如下: package cn.csdn.android.tesxt; import android.app.Activity; import android.content.DialogInterface; import android.os.Bundle; import ...

    Android 模拟数字拨号界面及打电话功能.rar

    激活打电话的Activity ,这里需要为0-9数字按钮创建监听器,得到按钮的引用,得到EditText的引用,还涉及到为所有数字按钮添加监听器:  for(int id:numButtonIds){   Button tempb=(Button)this.findViewById(id)...

    Activiti 5.15 用户手册

    内部实现类 2. 开始学习 一分钟入门 安装Activiti 安装Activiti数据库 引入Activiti jar和依赖 下一步 3. 配置 创建ProcessEngine ProcessEngineConfiguration bean 数据库配置 支持的数据库 创建数据库...

    discord.ts::robot_face:使用TypeScript和装饰器创建discord机器人!

    指数建立装饰工 声明您的Discord机器人 创建一个事件监听器 简单地创建命令系统 添加有关您的命令的信息 向命令添加高级规则 向事件和命令添加警卫API资讯资讯 :telephone_selector: 需要帮忙? 您也可以在的以及在...

    21天学通Java-由浅入深

    240 12.2.1 创建局部内部类 240 12.2.2 在局部内部类中访问外部类成员变量 240 12.2.3 在局部内部类中访问外部类的局部变量 241 12.2.4 静态方法中的局部内部类 243 12.3 静态内部类 244 12.3.1 创建静态内部类 244 ...

    java设计模式【之】Cglib动态代理【源码】【场景:帮爸爸买菜】

    创建被代理类、创建代理类、代理类内部聚合被代理类 * 2.创建返回代理类实例方法 Enhancer.create(object.getClass(), this); * (1.创建工具类,2.设置工具类的父类为被代理类 3.设计监听回调为当前this 4.return ...

    记事本(二)+资源+java+eclipse

    时间显示创建了一个内部时钟类 Clock。字体大小设置创建了一个外部类,使用package com;引用了外部类MQFontChooser。 与上一篇文章记事本(一)的区别是子菜单添加行为动作监听器, 三、特点中有说明。

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    javaSE代码实例

    15.1.2 外部类之内创建内部类对象 322 15.1.3 外部类之外创建内部类对象 323 15.1.4 内部类与外部类之间的成员互访 324 15.1.5 内部类与外部类的预定义对象引用this 327 15.2 局部内部类 328 15.2.1 局部...

    FLASH MX Professional 2004应用开发

    3.10 为TextField对象添加事件监听器 第4课 创建Button和MovieClip对象 第5课 创建类 第6课 创建组件 第7课 用Screen创建应用程序 第8课 使用Flash应用程序架构 第9课 学习UI组件架构 第10课 使用UI组件API 第11课 ...

    egret工具:事件监听管理器

    //创建和监听一个Timer事件 var timer: egret.Timer = new egret.Timer(50); BC.addEvent(this, timer, egret.TimerEvent.TIMER, this.onEnterTimer); timer.start(); } /** * dispatchSprite的帧事件 */ ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己的第一个Java程序跑...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己的第一个Java程序跑...

    java初学者必看

    13.5.1 事件监听器 13.5.2 事件适配器 13.5.3 事件 13.6 举例 13.6.1 界面设计 13.6.2 运算设计步骤 13.7 本章习题 第14章 Java I/O系统 14.1 I/O概述 14.2 文件操作 14.2.1 File类 14.2.2 File类应用 ...

    Activiti_V5.21_用户手册_中文版_完整目录书签.pdf

    1.7. 内部实现类 2. 开始 2.1. 一分钟入门 2.2. Activiti安装 2.3. Activiti数据库配置 2.4. 引入Activiti jar与依赖 2.5. 下一步 3. 配置 Configuration 3.1. 创建ProcessEngine Creating a ...

    Java2核心技术.part5

    8.1. 3将组件变成事件监听器 8.1.4实例:改变观感 8.1.5实例:捕获窗口事件 8.2 AWT事件继承层次 8.3 AWT的语义事件和低级事件 8.4低级事件类型 8.4.1键盘事件 8.4.2鼠标事件 8.4.3焦点事件 ...

    Java2核心技术.part3

    8.1. 3将组件变成事件监听器 8.1.4实例:改变观感 8.1.5实例:捕获窗口事件 8.2 AWT事件继承层次 8.3 AWT的语义事件和低级事件 8.4低级事件类型 8.4.1键盘事件 8.4.2鼠标事件 8.4.3焦点事件 ...

Global site tag (gtag.js) - Google Analytics