`
daojin
  • 浏览: 691576 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

监听者模式:(Swing监听器竟然是二叉树!!牛比!)

阅读更多
package asf;
interface Listener {
}
abstract class Event {

	//public abstract void happen();

	public abstract int getId();
}

class RainEvent extends Event {
	private static final int id = 1;

	 /*public void happen() {
		// TODO Auto-generated method stub
		System.out.println("raining");
	}*/
	public String toString(){
		return "raining";	
	}
	
	public  int getId() {
		// TODO Auto-generated method stub
		return id;
	}
}

class AlarmEvent extends Event {
	private static final int id = 3;

	/*public void happen() {
		// TODO Auto-generated method stub
		System.out.println("Alarming");
	}*/
	public String toString(){
		return "Alarming";	
	}
	public int getId() {
		// TODO Auto-generated method stub
		return id;
	}
}

class BroadcastEvent extends Event {
	private static final int id = 2;
	public  int getId() {
		// TODO Auto-generated method stub
		return id;
	}
	/*public void happen() {
		// TODO Auto-generated method stub
		System.out.println("Broadcasting");
	}*/
	public String toString(){
		return "Broadcasting";	
	}
}

interface RainListener extends Listener {
	public void rain(Event e);
}

interface RadioListener extends Listener {
	public void broadcast(Event e);
}

interface ClockListener extends Listener {
	public void alarm(Event e);
}

class ListenerCaster implements RainListener, RadioListener, ClockListener {
	Listener l1;

	Listener l2;

	ListenerCaster(Listener l1, Listener l2) {
		this.l1 = l1;
		this.l2 = l2;
	}

	public void rain(Event e) {
		// TODO Auto-generated method stub
		if(l1!=null){
		((RainListener) l1).rain(e);
		}
		if(l2!=null){
			((RainListener) l2).rain(e);
		}
	}

	public void broadcast(Event e) {
		// TODO Auto-generated method stub\
		if(l1!=null){
		((RadioListener) l1).broadcast(e);}
		if(l2!=null){
			((RadioListener) l2).broadcast(e);}
	}

	public void alarm(Event e) {
		// TODO Auto-generated method stub
		if(l1!=null){
			((ClockListener) l1).alarm(e);}
			if(l2!=null){
				((ClockListener) l2).alarm(e);}
		
	}
}

class TheNotifiedObject {
	RainListener rl;

	RadioListener ral;

	ClockListener cl;

	public void addRainListener(RainListener rl) {
		this.rl = new ListenerCaster(this.rl, rl);
	}

	public void addRadioListener(RadioListener ral) {
		this.ral = new ListenerCaster(this.ral, ral);
	}

	public void addClockListener(ClockListener cl) {
		this.cl = new ListenerCaster(this.cl, cl);
	}

	protected void processEvent(Event e) {
		switch (e.getId()) {
		case 1:
			if(ral!=null){
			rl.rain(e);
			}
			break;
		case 2:
			if(ral!=null){
			ral.broadcast(e);}
			break;
		case 3:
			if(cl!=null){
			cl.alarm(e);}
			break;
		}
	}
}

public class TheNotifiedObjectA extends TheNotifiedObject {
	
	TheNotifiedObjectA() {
		addClockListener(new ClockListener() {
			public void alarm(Event e) {
				// TODO Auto-generated method stub
				System.out.println(e);
			}

		});
		addRainListener(new RainListener() {
			public void rain(Event e) {
				// TODO Auto-generated method stub
				System.out.println(e);
			}
		});
		addRadioListener(new RadioListener() {
			public void broadcast(Event e) {
				// TODO Auto-generated method stub
				System.out.println(e);
			}
		});
	}
	public static void main(String[] args){
		Event e1=new AlarmEvent();
		Event e2=new RainEvent();
		Event e3=new BroadcastEvent();
		TheNotifiedObjectA k=new TheNotifiedObjectA();
		k.processEvent(e1);
		k.processEvent(e2);
		k.processEvent(e3);	
	}
}

 

分享到:
评论
5 楼 daojin 2009-02-18  
histan 写道
二叉树的核心思想是什么?

二叉树核心思想太多了:
    比如我的例子中,实际上是监听器放到叶子上,然后把叶子给遍历了一遍,却写了很少的代码:
class Tree{
       Tree left;//左边是树。
       Tree right;//右边是叶子。(在上面例子中)   
       getAccessToLeaf(){
          if(this.left!=null){
          this.left.getAccessToLeaf();//遍历左子树。
          }
          if(this.right!=null){
           this.right.getAccessToLeaf();//遍历右子树。
          }
          //如果左右都没有了,也就是叶子,打印以下语句。
          System.out.println("hello!")
       }
}
4 楼 histan 2009-02-18  
二叉树的核心思想是什么?
3 楼 daojin 2009-02-11  
Durian 写道
物件是台湾术语吧

物件就是对象吧
2 楼 Durian 2009-02-07  
物件是台湾术语吧
1 楼 daojin 2009-02-07  
物体发出------分发事件--------》自身---------发出处理事件------》监听器

第一步:物体可以安装不同种类的监听器,这样可以处理不同类型的消息。
通过组装的方式:
class ObjcetClass{
    ListenerInterface001 listener1;(在Swing中实际上是一个二叉树。)
    ListenerInterface002 listener2;
    ListenerInterface003 listener3;  
}
第二步:构造监听器,通过实现:
class Listener1 implements ListenerInterface001 {
}
class Listener2 implements ListenerInterface002{
}
class Listener3 implements ListenerInterface003{
}
第三步:将监听器安装到物体上(或者通过ADD接口):
listener1=new Listener1();(Swing 中是把,新的监听器安装到二叉树上)
listener2=new Listener2();
listener3=new Listener3();
第四步:
不同的事件映射为不同的监听器的实现,通过switch语句:
event1-->listener1
event2-->listener2
event3-->listener3  

注意:以上步骤中,监听器的实现优为重要。
因为监听器要访问发出事件的物体本身,因此,经常利用匿名类。

相关推荐

    二叉树结构显示

    这可能涉及到Swing或JavaFX库来创建窗口和事件监听器。 6. **递归**:在处理二叉树时,递归是常用的方法。递归函数可以轻松地处理树的层次结构,因为每个节点的处理可以分解为对子节点的相同操作。 7. **数据结构...

    java编写的GUI树的创立和遍历程序

    在Java编程语言中,GUI(图形用户界面)是与用户交互的一种重要方式。...通过这个程序,开发者能够向用户展示如何在Java环境中创建、操作和可视化树数据结构,同时也为学习者提供了一个良好的实践平台。

    整理一些大学做的课程设计,包括C语言、数据结构(C语言)、JS、JavaSwing、C#。.zip

    JavaSwing使用事件监听机制处理用户交互,且支持布局管理器来自动调整组件的大小和位置。Swing还提供了JTable、JTree等组件,用于展示表格和树形数据。同时,JavaSwing可以与JavaFX结合,创建更现代的图形效果。 **...

    2021-2022计算机二级等级考试试题及答案No.974.docx

    16. 动作事件监听器:实现ActionListener接口是实现动作事件监听器的常见方法,而不是继承ActionAdapter,因为ActionAdapter是适配器类,用于简化监听器的实现。 17. Word编辑状态:在Word中,新输入的文字会出现在...

    2006年4月全国计算机等级考试二级JAVA笔试试题及答案.docx

    WindowListener接口定义了一系列与窗口事件相关的监听器方法,如windowOpened()、windowClosed()、windowActivated()等,但不包括mouseDragged(),后者是MouseListener接口的一部分。 ### 18. 多分支语句 题目提到...

    java 编写的哈弗曼编码反编码的实现

    哈弗曼编码是一种高效的数据压缩方法,通过构建特殊的二叉树(哈弗曼树)来为数据中的每个字符分配一个唯一的、最短的二进制编码。这种编码方式使得频繁出现的字符拥有较短的编码,从而在整体上提高编码效率。在Java...

    2021-2022计算机二级等级考试试题及答案No.12426.docx

    - **MouseListener接口**:Java Swing中的接口之一,用于监听并处理鼠标事件。它不支持鼠标移动事件(MouseMotionEvent),这部分功能通常由MouseMotionListener接口实现。 ### 9. Access中表和数据库的关系 - **...

    Java基础总结_java初学_java基础

    `监听器的写法.Java.bak`文件可能包含有关Java事件监听器的信息。在GUI编程中,我们经常需要监听用户的行为,比如点击按钮。Java提供了各种监听器接口,如ActionListener,用于处理按钮点击事件。 3. **数据结构:...

    java家谱打包程序

    Java家谱打包程序是一款专为科技月月评设计的重要作业,它主要针对大学Java学习者,旨在提升他们的编程技能和项目实践经验。这个程序的核心在于利用Java语言构建一个能够记录、展示和管理家族成员关系的系统,即家谱...

    D.S.-Project-Juego:数据结构主题G03-2021年的项目

    4. **设计模式**:可能用到单例模式、工厂模式、观察者模式等,来实现游戏逻辑或组件间的交互。 5. **图形用户界面(GUI)**:可能使用JavaFX或Swing来创建游戏的可视化界面,让用户可以直观地与游戏互动。 6. **...

    面向对象编程II:面向对象编程II

    匿名类则是没有名字的类,常用于简洁地实现回调或事件监听器。 2. **多线程并发系统**: - **线程**:Java提供了Thread类来创建和管理线程,可以并发执行任务,提高程序效率。 - **线程安全**:当多个线程访问...

    地址簿

    8. **设计模式**:在实现特定功能时,可以应用设计模式,如单例模式(管理地址簿实例)、工厂模式(创建Person对象)或观察者模式(实时更新UI)。 9. **测试**:使用JUnit或其他单元测试框架对代码进行测试,确保...

    坎波-米纳多:Projeto do Curso JAVA(Udemy)

    4. **图形用户界面(GUI)**:可能使用JavaFX或Swing库创建游戏界面,学习事件监听和处理。 5. **多线程**:可能涉及并发执行,比如游戏计时器或用户输入的异步处理。 6. **算法和数据结构**:例如二叉树、队列或栈...

    oxsar2-java:Oxsar2 java战斗计算器,见Oxsar2游戏http

    GUI设计涉及布局管理器、事件监听和回调函数等概念,需要开发者具备一定的图形界面设计能力。 至于"oxsar2-java-master"这个文件名,很可能表示这是一个开源项目,"master"通常指的是Git仓库中的主分支,意味着我们...

Global site tag (gtag.js) - Google Analytics