`
SW_2011
  • 浏览: 7905 次
社区版块
存档分类
最新评论

监听器模型 ——通信层与界面层分离

    博客分类:
  • java
 
阅读更多

监听器模型1:

         界面上添加组件,组件上add监听器,监听器中实现响应。

         比如:点击按钮,在界面上显示一行字,则需要把界面传至监听器中。

         弊端:耦合度强,不适合以后扩展。如若界面上又要添加一个组建,而该组建在监听器中又要用到,则需修改界面和监听器中的代码。

 

监听器模型2:

          界面层与通信层分离,高内聚,低耦合,适合扩展。

         实例:界面上有一个接受文本按钮和一个接收图片按钮,以后可能还要继续添加接收文件,音频等按钮。

          实现方法:

1 定义接口,里面为需要重写的接收方法。

 

2 把组建(按钮)当做消息监听器,继承JButton,实现接口,则成了一个消息监听器。

 

3 把通信类当做消息事件源,在这个类中有一个监听器队列,队列中每一个监听器都能监听该通信类中事件的发生。

 

4 实例化一个通信类对象,给它注册监听器。

 

另一实例:

public interface ImsgReciverListener {
	
	public void rece(Msg m);//接收消息的方法
}

 

//把自己写 的JTree作为消息监听器
public class NetJavaJTree extends JTree implements ImsgReciverListener{

	@Override
	public void rece(Msg m) {
		//取得这个树上的根节点
		DefaultMutableTreeNode root =(DefaultMutableTreeNode)this.getModel().getRoot();
		//将消息对象包装为新建的节点
		DefaultMutableTreeNode newnode = new DefaultMutableTreeNode(m);
		root.add(newnode);//将新建的节点加载树上
		SwingUtilities.updateComponentTreeUI(this);//刷新界面
	}
}

 

/*
 * 模拟通信层的消息接收,相当于消息事件源
 */
public class NetConnector extends Thread{
	
	public void run() {
		int t=0;
		while(true) {
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			t++;
			Msg m = new Msg();
			m.setId(t);
			m.setContent("第"+t+"条消息");
			//分发这条消息给它的监听器
			fireMsgRec(m);
		}
	}
	
	//给该对象增加一个监听器
	public void addListener(ImsgReciverListener listener) {
		list.add(listener);
	}
	
	//将接收到的消息通知队列中的所有监听器去处理
	public void fireMsgRec(Msg m) {
		for(int i=0;i<list.size();i++) {
			list.get(i).rece(m);
		}
	}
	
	
	
	//保存消息监听器的队列
	private List<ImsgReciverListener> list = new ArrayList();
}

 

 

//主界面
public class MainUI extends JFrame{
	
	
	public static void main(String[] args) {
		MainUI mu = new MainUI();
		NetConnector con = new NetConnector();
		con.start();
		
		//创建只有一个跟节点的树,加到界面上
		DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("根节点");
		
		DefaultTreeModel dm = new DefaultTreeModel(rootNode);
		//创建树对象,为一个消息监听器
		NetJavaJTree tree = new NetJavaJTree();
		tree.setModel(dm);//设置树模型为自己定义的dm
		con.addListener(tree);//注册消息监听器
		mu.setupUP(tree);//显示主界面
	}
	
	public void setupUP(NetJavaJTree tree) {
		this.setTitle("测试界面");
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(3);
		this.setSize(200,200);
		this.add(tree);
		this.setVisible(true);
	}
	
	
}

 

简单说:按笔者理解,核心就是组件与监听器绑定,因此只需要给通信模型注册该组建,即实现了一种功能。当以后要添加别的组建时,只需要实现接口,重写接口中的方法,并把它注册到该通信类就可以。

 

 注意:java有设计模式,但我们不能限于模式;有模型,但也不能陷于模型。比如,此种第二种监听器模型在界面上的组建不相互调用时好用,但若界面上的组件会相互调用,就还有待进一步研究。

分享到:
评论

相关推荐

    java 图形界面程序——科研申报

    2. **模型-视图-控制器(MVC)**:为了保持代码的清晰和可维护性,开发者可能会采用MVC设计模式,将界面展示(视图)、用户交互(控制器)和数据处理(模型)分离。 3. **数据验证**:在用户输入科研项目信息时,...

    IOS应用源码——PPRevealSideViewController界面切换效果.rar

    4. **MVC(Model-View-Controller)设计模式**:iOS应用通常遵循MVC模式,将数据模型、视图和控制器分离。在这个项目中,`PPRevealSideViewController`作为控制器,管理着与界面切换相关的逻辑,而视图则负责显示...

    安卓Android源码——电子书阅读器项目源码 (2).zip

    这个压缩包文件“安卓Android源码——电子书阅读器项目源码 (2).zip”包含了一个安卓平台上的电子书阅读器应用的源代码。通过分析这些源码,我们可以深入理解如何在Android系统上构建一个功能完备的电子书阅读器。这...

    14_JavaWeb——Vue配套资源

    - **数据绑定**:Vue采用双向数据绑定,使得视图与模型之间保持同步。通过`v-bind`指令,我们可以将HTML元素的属性与Vue实例的数据绑定,而`v-model`则用于表单控件的数据双向绑定。 - **指令系统**:Vue提供了一...

    Android源码——电影简介分析源码.zip

    在本压缩包“Android源码——电影简介分析源码.zip”中,我们可以探索一个与Android应用开发相关的项目,特别关注如何在Android平台上实现电影简介的分析。这个项目可能包括了获取电影数据、解析JSON格式的电影信息...

    IOS应用源码——iPad记事本.zip

    4. **MVVM(Model-View-ViewModel)架构**:这是一种流行的设计模式,将业务逻辑与用户界面分离。ViewModel负责处理数据和业务逻辑,Model代表数据模型,View则负责显示内容。了解MVVM可以帮助理解应用的组织结构。 ...

    iOS实例开发源码——mmower-pianist-08709fa.zip

    5. **MVC(Model-View-Controller)设计模式**:iOS开发通常遵循MVC模式,它将数据模型、用户界面和控制器逻辑分离开来,使得代码更易于维护和扩展。开发者可以从源码中学习如何在实践中应用MVC。 6. **Storyboard...

    IOS应用源码——侧边划出划开.rar

    7. ** MVC(Model-View-Controller)架构**:遵循苹果推荐的MVC架构,将业务逻辑、视图和数据模型分离,使代码更易于理解和维护。 学习这个源码可以帮助开发者了解如何在iOS应用中集成侧滑菜单,包括手势识别、视图...

    安卓Android源码——(精)仿博客园客户端源码.zip

    源码通常会按照MVC(模型-视图-控制器)或MVVM(模型-视图-ViewModel)设计模式来组织,以便更好地分离业务逻辑、用户界面和数据管理。 1. **布局设计**:应用界面的设计通常使用XML文件来定义,这些文件包含了各个...

    ASP.NET源码——[聊天留言]Asp.net多模式留言系统.zip

    【ASP.NET源码——[聊天留言]Asp.net多模式留言系统】 ASP.NET是一个由微软开发的用于构建Web应用程序的框架,它提供了丰富的工具、库和API,使得开发者能够更高效地创建动态、交互式的网页应用。在这个【聊天留言...

    Flex Project

    当登录验证成功或失败时,模型层会发送一个通知,控制器或视图可以监听这个通知并作出相应的响应,如显示成功信息或错误提示。 5. **纯MVC结构**:整个项目按照PureMVC的结构组织,使得代码易于理解和扩展。例如,...

    ASP.NET源码——[聊天留言]最简单无刷新聊天室.zip

    聊天框、发送按钮、消息列表等元素需要通过JavaScript事件监听器进行交互处理。 6. **安全考虑**: 聊天室需要考虑的安全问题包括身份验证、防止XSS(跨站脚本攻击)和CSRF(跨站请求伪造)。ASP.NET提供了一套完整...

    Java Web开发实践教程——从设计到实现(第2版)源代码

    2. **MVC模式**:Model-View-Controller模式是Java Web开发中的常用架构模式,用于分离业务逻辑、数据模型和用户界面。在源代码中,你可能会看到对应的控制器类、模型类和视图文件,理解它们之间的协作机制。 3. **...

    Android应用源码项目之——漂亮的平台书架-IT计算机-毕业设计.zip

    6. **事件监听**:为了响应用户交互,如点击事件,开发者会在UI组件上设置监听器,用以执行相应的业务逻辑。 7. **模块化设计**:良好的代码结构对于大型项目至关重要。开发者可能会采用MVP(Model-View-Presenter...

    Java+Swing+Mysql停车场管理系统

    6. **事件驱动编程**: Swing采用事件驱动编程模型,当用户进行操作(如点击按钮)时,会触发特定的事件,由对应的事件监听器进行处理。 7. **JDBC(Java Database Connectivity)**: JDBC是Java中连接数据库的标准...

    IOS应用源码——可扩展的输入框.zip

    7. **委托协议**:为了与父视图或其他类通信,源码可能定义了一个委托协议,比如`InputToolbarDelegate`,包含了诸如发送消息、关闭输入框等方法。 8. **自定义工具栏**:工具栏的定制可能涉及到自定义`...

    ASP.NET多功能聊天软件的设计与开发——文字聊天文件传输模块(源代码+论文).zip

    ASP.NET框架提供了一个模型-视图-控制器(MVC)架构,使得开发者能够清晰地分离业务逻辑、数据处理和用户界面。在这个聊天软件中,模型可能负责处理聊天消息和文件的数据存储,视图则负责呈现聊天界面,而控制器处理...

    Qt游戏编程——飞机大战

    最后,考虑到游戏的可扩展性和重用性,建议将游戏逻辑和界面分离。使用MVC(模型-视图-控制器)设计模式可以更好地组织代码结构,使得游戏模板易于维护和升级。 总结来说,Qt游戏编程提供了一套强大且灵活的工具,...

    安卓Android源码——教务选课学生成绩管理项目.zip

    这个安卓Android源码项目是一个教务选课与学生成绩管理的应用程序,旨在帮助学校管理员进行学生选课和成绩管理的数字化操作。源码的详细分析可以揭示许多关键的Android开发知识点,对于学习和理解Android应用程序...

Global site tag (gtag.js) - Google Analytics