- 浏览: 565814 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (344)
- ··············未分类············· (33)
- Eclipse 插件 (15)
- EDA 工具 (1)
- Linux/Unix (3)
- Java (43)
- Java Applet (1)
- Java Draw2d (22)
- Java Draw2d version2 (6)
- Java GEF (2)
- Java SWT (21)
- Java SWT Image 图像 (21)
- Java SWT Tree (16)
- Java SWT Table (4)
- Java SWT TableViewer (11)
- Java SWTbot (4)
- Java Test (2)
- Java Thread 多线程 (22)
- Java Zest (5)
- RC2_3S400学习笔记 (16)
- tcl 脚本 (10)
- Verilog (7)
- XML (6)
- 国家 (5)
- 感叹 (4)
- 面试题 (9)
- 生活 (36)
- 足球 世界杯 (8)
- 老公看你的 (3)
- web开发 (1)
- 数据结构——图 (7)
- c language (1)
最新评论
-
zxjlwt:
路过素人派http://surenpi.com
SWT 树的事件 SWT.Selection SWT.CHECK SWT.DefaultSelection -
hj01kkk:
1楼用法正解
JDK 7 中的 Fork/Join 模式 -
fish_no7:
使用 new SortTask().fork()
JDK 7 中的 Fork/Join 模式 -
wpf523:
mark
Java 多线程例子6 线程安全 线程同步 同步代码块 同步函数 -
uniquejava:
以前碰到过,估计是在icu包中实现了双击自动选中一段文本的功能 ...
java.lang.NoClassDefFoundError: com/ibm/icu/text/BreakIterator
PropertyChangeSupport的使用,有这么几个类是相关的PropertyChangeEvent、PropertyChangeListener;
看一个小的例子:
public class A_listViewerExample { public static void main(String[] args) { Display display = Display.getDefault(); Shell shell = new Shell(display); shell.setSize(400, 400); shell.setLayout(new FillLayout()); ListViewer viewer = new ListViewer(shell, SWT.BORDER); viewer.setLabelProvider(new LabelProvider()); viewer.setContentProvider(new ContentProvider()); viewer.setInput(getData()); ((ListModel)viewer.getInput()).printInfo(); shell.open(); viewer.add(new UserModel("3","Ascos")); ((ListModel)viewer.getInput()).add(new UserModel("4","Jack")); ((ListModel)viewer.getInput()).printInfo(); // viewer.refresh(); while (!shell.isDisposed()) if (!display.readAndDispatch()) display.sleep(); } private static Object getData() { ListModel input = new ListModel(); input.add(new UserModel("1","Chris")); input.add(new UserModel("2","Leon")); return input; } } class LabelProvider implements ILabelProvider { public Image getImage(Object element) { return Display.getCurrent().getSystemImage(SWT.ICON_WORKING); } public String getText(Object element) { if(element instanceof UserModel) return ((UserModel)element).getName(); return element.toString(); } public boolean isLabelProperty(Object element, String property) { return false; } public void dispose() {} public void addListener(ILabelProviderListener listener) {} public void removeListener(ILabelProviderListener listener) {} } class ContentProvider implements IStructuredContentProvider, PropertyChangeListener { private ListViewer viewer; public Object[] getElements(Object inputElement) { if(inputElement instanceof ListModel) return ((ListModel)inputElement).elements(); return null; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = (ListViewer) viewer; if (oldInput instanceof ListModel) ((ListModel) oldInput).removePropertyChangeListener(this); if (newInput instanceof ListModel) ((ListModel) newInput).addPropertyChangeListener(this); } public void propertyChange(PropertyChangeEvent event) { if(event.getPropertyName().equals(ListModel.ADD_ELEMENT)) viewer.add(event.getNewValue()); if(event.getPropertyName().equals(ListModel.REMOVE_ELEMENT)) viewer.remove(event.getNewValue()); } public void dispose() {} } class ListModel { public static final String ADD_ELEMENT = "add Element"; public static final String REMOVE_ELEMENT = "remove Element"; private PropertyChangeSupport delegate; private Vector<Object> content; public ListModel() { content = new Vector<Object>(); delegate = new PropertyChangeSupport(this); } public void addPropertyChangeListener(PropertyChangeListener listener) { delegate.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { delegate.removePropertyChangeListener(listener); } public void firePropertyChange(PropertyChangeEvent event) { delegate.firePropertyChange(event); } public void add(Object element) { if (content.add(element)) firePropertyChange(new PropertyChangeEvent(this, ADD_ELEMENT, null, element)); } public void remove(Object element) { if (content.remove(element)) firePropertyChange(new PropertyChangeEvent(this, REMOVE_ELEMENT, null, element)); } public Object[] elements() { return content.toArray(); } public void printInfo() { for(Object o : content) { if(o instanceof UserModel) { UserModel user = (UserModel)o; System.out.println("The user id is "+user.getId() + ", and name is " + user.getName()); } } } } class UserModel { private String id; private String name; public UserModel(String id, String name) { this.id = id; this.name = name; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public String getId() { return id; } public String getName() { return name; }
一个简单的Jface的ListViewer的例子,这是一个PropertyChangeSupport的典型的在GUI的中的应用,在GUI中有一个普遍的问题,就是数据和图形同步的问题,如上面的例子ListViewer,【viewer.add(new UserModel("3","Ascos"));】这个就是仅仅在图像中的增加了数据项,而在对应的数据原型上面listModel上面根本没有增加数据项,这个带来了一个问题,就是图形显示的和底层数据的不一致的问题,这样的话,要是GUI一但刷新的画,就会出现问题了,应该通常的数据刷新都是GUI根据底层数据来刷新,就发现刷新完的GUI数据项“Ascos”不见了。上面的例子,可以将【viewer.refresh();】这个注释的语句打开就可以测试一下。
为了保持数据和GUI的同步,只有Data.add同时View.add,还要Data.remove的同时View.remove;这个办法能够解决上面的数据和GUI显示同步的问题,但是对于后期的维护和功能的扩展是非常不方便的,如考虑GUI的常常出现的一种扩展的需求,如上面的List的例子,现在老板觉得是不是table的显示或者tree或者tabletree或者graphics的显示是不是更好一些呢,于是有了view1、view2、view3、在没有一个数据add的地方,加上对view的add,remove的地方也是。这样的修改,常常出现遗漏和错误。
应该PropertyChangeSupport,就可以解决上面的问题,数据看成是属性的提供方,所有的view都看着做是,这个属性的监听方,这样不管你加入多少的view,在创建view的时候,就注册到属性提供方中去,然后数据的变化就会。
其实,这个也很好的实现了GUI中的基本思想就MVC的思想,M就是基本的数据单元,V就是各种View,C就是逻辑业务单元的处理,这个负责M的创建也就是Data的创建,增加,删除等操作,V自动对应到Data模型,是多么完美的事情啊。
不过,这种属性监听的模式,和观察者的模式,非常的相似,观察者=监听者;被观察者=背监听者=管理者;
发表评论
-
异常Exception
2014-08-15 14:22 0有三种基本的异常类。 Error用于Java虚拟机报告系 ... -
hashmap的简单实现
2014-08-15 14:20 711来自Thinking In Java【P493】。 Ja ... -
hashcode的实现
2014-08-15 14:18 733ThinkinJava中给出了Effective Java的 ... -
验证Hashmap不支持同步,ConcurrentHashMap支持
2014-08-15 14:14 972一直都不知道concurrenthashmap有什么实际的用 ... -
Java 中的嵌套类可以访问Private
2014-07-18 10:54 630注意:Java中的嵌套类与C++中的嵌套类大致一致,只不过C ... -
简单的递归转非递归例子 Fibonacci
2014-07-11 14:41 814package org.vocano.java.tst.re ... -
Java中的缓存
2014-07-10 15:48 648原文链接:http://blog.sina.com.cn/s ... -
快速随机访问和可删除的数组
2014-06-06 16:03 616原文链接:http://www.blogjava.net/q ... -
广度优先 深度优先访问 树
2014-06-06 15:37 660public class Tst { sta ... -
类语句块
2014-03-31 15:49 548public class Snippet extends s ... -
字符串不同,hashcode可以相同
2014-03-31 15:22 744public class Snippet { publi ... -
基本的小程序
2014-03-25 14:45 755斐波那契数列。(Fibonacci) public cla ... -
Java中hashCode和equals方法的正确使用
2014-02-19 11:28 731面试题:新建一个类,这个类要作用hashmap的键值,问需要 ... -
一个字符串在另一个字符串中出现的次数
2013-12-13 17:09 690一个字符串在另一个字符串中出现的次数 pub ... -
Java hashcode
2013-09-25 16:19 749原文:http://www.ibm.com/develope ... -
java 没有无符号整数
2013-09-02 17:09 964由于Java的原始类型里没有无符号类型,如果你需要某个宽度的 ... -
数组操作
2013-06-24 16:28 6741 数组倒叙:Snippet181 写道 int[] ... -
write object, read object 不一定比自己parse快速,只是简单,可以扩展好
2013-05-13 17:19 780write object, read object 不一定比 ... -
java.lang.IllegalStateException
2013-04-17 18:34 1147在使用iterator的remove的时候出现了java.la ... -
函数返回值
2013-04-17 18:15 791现在代码的水平还是 ...
相关推荐
在Java编程中,`PropertyChangeSupport` 是一个用于实现属性更改通知机制的工具类,它在JavaBeans规范中被广泛使用。这个类帮助开发者轻松地为对象添加属性变更监听器,以便在对象的属性发生变化时通知其他感兴趣的...
我们使用 PropertyChangeSupport 类来管理该属性的变化,然后在 setter 方法中使用 firePropertyChange 方法来通知监听器。 在客户端代码中,我们创建了一个 TestBean 实例,然后添加了两个监听器 ...
在"PropertyChangeSupportApi-master"这个项目中,我们可以预期看到一个示例实现,展示如何在自定义类中使用 `PropertyChangeSupport` 来处理属性变化事件,以及如何添加和管理相关的注释。通过分析这个项目的源代码...
闲着没事,突然想起Java的观察者模式中有一个PropertyChangeSupport与PropertyChangeListener,于是就想看看用js能不能也实现一个,毕竟有时候js写的东西也需要一个观察者模式,于是就写了点东西,应该能派上用场。
下面是一个简单的示例,展示如何使用 `PropertyChangeSupport` 来管理关联属性的变化。 ```java public class MyBoundBean implements Serializable { private String ourString = "Hello"; private ...
通过理解并正确使用"PropertyChangeSupport",开发者可以在Java应用程序中实现更加灵活和健壮的组件交互,使得系统更易于扩展和维护。设计模式,如观察者模式,是软件工程中不可或缺的一部分,它们为解决复杂问题...
6. **触发事件**:在setter方法中,使用`firePropertyChange`方法触发`PropertyChangeEvent`,传递旧值和新值以及属性名称。 7. **处理事件**:在其他组件或类中,可以通过实现`PropertyChangeListener`接口并重写`...
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); public Person() {} public void addPropertyChangeListener(String propertyName, PropertyChangeListener ...
首先,声明并实例化一个PropertyChangeSupport对象,然后使用它的`firePropertyChange()`方法来触发属性改变事件。开发工具或手动编程时,可以通过`addPropertyChangeListener()`和`removePropertyChangeListener()`...
- **PropertyChangeSupport**:在JavaBeans中,`PropertyChangeSupport`类用于管理`PropertyChangeEvent`。通过添加`PropertyChangeListener`,对象可以监听其他对象的属性变化。当Bound属性值改变时,`...
了解了基本概念后,我们可以深入学习JavaBeans的高级特性,比如属性编辑器、定制事件、属性改变通知(`PropertyChangeSupport`和`VetoableChangeSupport`)、国际化支持(`ResourceBundle`)以及JavaBeans的容器支持...
此外,还可能涉及JavaBean的事件处理机制,例如ActionListener,以及如何使用PropertyChangeSupport类来实现属性变化监听。 "学员总结复习本门课程模板V1.0.ppt"则可能是一个详细的复习指南,涵盖了JavaBean的主要...
这通过实现`PropertyChangeSupport`类和使用`firePropertyChange`方法来实现。其他组件可以通过注册为`PropertyChangeListener`来监听特定属性的变化。 7. **国际化**:为了支持多语言环境,JavaBean可以包含资源包...
4. **数据绑定**:在Swing中,可以使用PropertyChangeSupport类进行属性变化的通知,使得视图能够实时响应模型数据的变化,实现双向数据绑定。 5. **数据库连接与操作**:系统可能使用JDBC(Java Database ...
此外,JavaBeans还可以通过`PropertyChangeSupport`类支持属性变更事件。当某个属性值改变时,可以通知监听器进行相应的处理。以下是一个简单的示例: ```java public class PersonBean extends Observable { ...
此外,`java.beans`包提供的`PropertyChangeSupport`类可帮助实现属性改变的监听功能。 Servlet是Java平台上的服务器端程序,主要处理HTTP请求。Servlet生命周期包括加载、实例化、初始化、服务、销毁五个阶段。...
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); public String getText() { return text; } public void setText(String newText) { String oldValue = text; ...
- **属性通知**:可选的`PropertyChangeSupport`机制,用于监听属性变化。 **3. JSP与JavaBean的结合** 在网上书店系统中,JavaBean通常作为模型(Model)层,负责数据处理和业务逻辑,而JSP作为视图(View)层,...
private PropertyChangeSupport listeners = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener l) { listeners.addPropertyChangeListener(l); } // 省略...
private PropertyChangeSupport changes = new PropertyChangeSupport(this); public void setOurString(String newString) { String oldString = ourString; ourString = newString; changes....