项目:查看器的使用

之前用的是table控件,发现无法更新数据,虽然实现了编辑,但是关掉窗口再打开时还是原来的样子,数据没变,不知道是我程序的问题,还是本来就不能更新。翻了会书,觉得可以试下查看器。

Eclipse插件开发这个本书:

1.查看器框架:

模型成为输入,查看器本身充当控制器,高级控件作为视图,当输入改变时,查看器负责相应的改变控件的内容。主要有list viewer,table viewer,tree viewer。

查看器框架组成部分:

(1)模型何元素:存储着要显示的数据

(2)内容提供者,标签提供者:负责将数据模型转化为可显示的文字和图片

(3)控件:显示内容

(4)查看器:协调上述工作

内容提供者的任务:

(1)通常外部程序无法直接提供查看器需要的模型,开发者需要自己解析模型,并且从中取得查看器需要的内容。

(2)监听数据模型的变化,当接收到变化的消息时,要通知查看器,然后查看器把这些变化转化成针对控件的操作,反应在界面上。

有个疑问:我能否直接在界面上修改,然后让界面上的修改转化为数据的修改,下次打开时,界面仍然保持修改后的样子?

http://topmanopensource.iteye.com/blog/604951

上面说可以,提供了代码,但是不知道自己试起来如何。

标签提供者的任务:

通过内容提供者得到元素后,将其转化成可以显示的文字和图片。

2.所以具体步骤是:

(1)定义元素类,设计数据模型

(2)编写内容提供者,将数据模型中的元素集合提取出来。

(3)编写标签提供者,将每一个元素转换成文本/图片以用于显示。

(4)创建控件

(5)创建内容查看器对象,将内容/标签提供者安装到查看器上,并且为查看器设定数据类型。

3.学习:用列表查看器开发一个显示用户信息的程序:

(1)定义作为查看器元素的User类型。

 1 package book.ch7.list;
 2
 3 public class User {
 4     private String id;
 5     private String name;
 6     public User(String id, String name) {
 7         this.id = id;
 8         this.name = name;
 9     }
10     public String getId() {
11         return id;
12     }
13     public void setId(String id) {
14         this.id = id;
15     }
16     public String getName() {
17         return name;
18     }
19     public void setName(String name) {
20         this.name = name;
21     }
22 }

(2)创建了一个listModel用来维护user对象,可以add或者remove一个user,同时还会向监听者发消息。

 1 package book.ch7.list;
 2
 3 import java.beans.PropertyChangeEvent;
 4 import java.beans.PropertyChangeListener;
 5 import java.beans.PropertyChangeSupport;
 6 import java.util.Vector;
 7
 8 public class ListModel {
 9
10     public static final String ADD_ELEMENT = "addElement";
11
12     public static final String REMOVE_ELEMENT = "removeElement";
13
14     private PropertyChangeSupport delegate;
15
16     private Vector content;
17
18     public ListModel() {
19         content = new Vector();
20         delegate = new PropertyChangeSupport(this);
21     }
22
23     public void addPropertyChangeListener(PropertyChangeListener listener) {
24         delegate.addPropertyChangeListener(listener);
25     }
26
27     public void firePropertyChange(PropertyChangeEvent evt) {
28         delegate.firePropertyChange(evt);
29     }
30
31     public void removePropertyChangeListener(PropertyChangeListener listener) {
32         delegate.removePropertyChangeListener(listener);
33     }
34
35     public void add(Object element) {
36         if (content.add(element))
37             firePropertyChange(new PropertyChangeEvent(this, ADD_ELEMENT, null,
38                     element));
39     }
40
41     public void remove(Object element) {
42         if (content.remove(element))
43             firePropertyChange(new PropertyChangeEvent(this, REMOVE_ELEMENT,
44                     null, element));
45     }
46
47     public Object[] elements() {
48         return content.toArray();
49     }
50 }

(3)内容提供者

 1 package book.ch7.list;
 2
 3 import java.beans.PropertyChangeEvent;
 4 import java.beans.PropertyChangeListener;
 5
 6 import org.eclipse.jface.viewers.IStructuredContentProvider;
 7 import org.eclipse.jface.viewers.ListViewer;
 8 import org.eclipse.jface.viewers.Viewer;
 9
10 public class ListContentProvider implements IStructuredContentProvider,
11         PropertyChangeListener {
12
13     private ListViewer viewer;
14
15     private ListModel model;
16
17     public Object[] getElements(Object inputElement) {
18         return model.elements();
19     }
20
21     public void dispose() {
22     }
23
24     public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
25         this.viewer = (ListViewer) viewer;
26
27         if (oldInput instanceof ListModel)
28             ((ListModel) oldInput).removePropertyChangeListener(this);
29
30         if (newInput instanceof ListModel) {
31             this.model = (ListModel) newInput;
32             ((ListModel) newInput).addPropertyChangeListener(this);
33         }
34
35     }
36
37     public void propertyChange(PropertyChangeEvent evt) {
38         if (ListModel.ADD_ELEMENT.equals(evt.getPropertyName()))
39             viewer.add(evt.getNewValue());
40         if (ListModel.REMOVE_ELEMENT.equals(evt.getPropertyName()))
41             viewer.remove(evt.getNewValue());
42     }
43 }

(4)标签提供者

 1 package book.ch7.list;
 2
 3 import org.eclipse.jface.viewers.ILabelProvider;
 4 import org.eclipse.jface.viewers.ILabelProviderListener;
 5 import org.eclipse.swt.graphics.Image;
 6
 7 public class ListLabelProvider implements ILabelProvider {
 8
 9     public Image getImage(Object element) {
10         return null;
11     }
12
13     public String getText(Object element) {
14         if(element instanceof User)
15             return ((User)element).getName();
16         return element.toString();
17     }
18
19     public boolean isLabelProperty(Object element, String property) {
20         return false;
21     }
22
23     public void dispose() {}
24
25     public void addListener(ILabelProviderListener listener) {}
26
27     public void removeListener(ILabelProviderListener listener) {}
28 }

(5)查看器

 1 package book.ch7.list;
 2
 3 import org.eclipse.jface.viewers.ListViewer;
 4 import org.eclipse.swt.SWT;
 5 import org.eclipse.swt.layout.FillLayout;
 6 import org.eclipse.swt.widgets.Display;
 7 import org.eclipse.swt.widgets.Shell;
 8
 9 public class UsingListViewer {
10
11     public static void main(String[] args) {
12         Display display = Display.getDefault();
13         Shell shell = new Shell(display);
14         shell.setSize(400, 400);
15         shell.setLayout(new FillLayout());
16
17         ListViewer viewer = new ListViewer(shell, SWT.BORDER);
18
19         viewer.setContentProvider(new ListContentProvider());
20         viewer.setLabelProvider(new ListLabelProvider());
21
22         ListModel input = new ListModel();
23         viewer.setInput(input);
24
25         shell.open();
26         shell.layout();
27
28         input.add(new User("1","张三"));
29         input.add(new User("2","李四"));
30         input.add(new User("3","王五"));
31
32
33         while (!shell.isDisposed())
34             if (!display.readAndDispatch())
35                 display.sleep();
36     }
37
38 }

时间: 2024-10-10 13:51:56

项目:查看器的使用的相关文章

Qt项目实战2:简单的图片查看器(1)

在博文http://www.cnblogs.com/hancq/p/5817108.html中介绍了使用空的Qt项目创建带有菜单栏.工具栏的界面. 这里,使用一个简单的图片查看器项目,来熟悉一下Qt的图片显示和基本操作. 该项目分为两部分: (1)实现图片的打开.关闭.居中显示.上一张/下一张切换 (2)实现图片的放大.缩小.左旋.右旋.另存为等操作 需要用的Qt类: QFileDialog QImage QPixmap QFileInfo 使用空的Qt项目创建带有菜单栏和工具栏的界面的操作参考

在web项目中集成pdf.js的默认查看器

pdf.jsMozilla开源的一项用于在HTML5平台上显示pdf文档的技术,Mozilla自己的Firefox浏览器也用了pdf.js来预览pdf,可见应该是一个比较成熟稳定的方案(btw,chrome用的是foxit的技术,国人骄傲啊).当然类似的方案有很多,并且大多都提供了丰富的api,如果你仔细读文档/api,可能会有好的收获,但是Mozilla同时把在Firefox内的查看器也一道开源了,对于大部分定制性不强,只需要浏览的使用场景来说,似乎可以直接"拿来主义",本文就说的是

【黑马Android】(05)短信/查询和添加/内容观察者使用/子线程网络图片查看器和Handler消息处理器/html查看器/使用HttpURLConnection采用Post方式请求数据/开源项目

备份短信和添加短信 操作系统短信的uri: content://sms/ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima28.backupsms" android:versionCode="1

android---利用android-async-http开源项目实现网络图片查看器

1.   导包:导入android-async-http开源项目的最新版本的包 2.简单的搭建一个网络图片查看器的界面 相关的界面搭建代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent

SharePoint ULS Log Viewer 日志查看器

SharePoint ULS Log Viewer 日志查看器 项目描述 这是一个Windows应用程序,更加轻松方便查看SharePoint ULS日志文件.支持筛选和简单的视图. 信息 这是一个WPF应用程序,LINQ支持. 目前版本有以下特点: 1. 转换和打开多个SharePoint ULS日志(如果选择多个或合并). 2. 记录并改变列大小,在任何列排序. 3. 支持Severity.Category和Process或自定义文本过滤.搜索. 4. 将多行单个日志跟踪记录分组更容易查看.

安卓开发教程-实战网页源代码查看器,安卓程序员必备

本系列教程致力于可以快速的进行学习安卓开发,按照项目式的方法,通常一篇文章会做一个小程序.提高学习的兴趣. 一方面总结自己所得,另一方面可以通过自己的分享帮助更多学习的同仁. 因为知识的连贯性,推荐按照瞬息进行学习.目录链接:http://www.chengxiaoxiao.com/bozhu/1336.html 本教程由今日头条-做全栈攻城狮原创首发,转载请注明出处. 求兼职:请联系wx:aiquanzhan 页尾提供github源代码下载地址. 一.项目描述: 众所周知,组成网站的每个页面都

Android仿微信朋友圈图片查看器

转载请注明出处:http://blog.csdn.net/allen315410/article/details/40264551 看博文之前,希望大家先打开自己的微信点到朋友圈中去,仔细观察是不是发现朋友圈里的有个"九宫格"的图片区域,点击图片又会跳到图片的详细查看页面,并且支持图片的滑动和缩放?这个功能是不是很常用呢?!那么我今天正好做了这个Demo,下面为大家讲解一下.首先按照惯例先看一下效果图吧,尤其不会录制gif动画(哎~没办法,模拟器不支持多点触控,刚好我的手机又没有Roo

2015元宵节礼物——《刀塔传奇》骨骼动画查看器,开源啦!

首先声明,我不是第一个做出类似查看器的首作者,我所知道的首作者是johance,以下是它在cocoschina发布的贴子. 分享 刀塔查看器Flash導出版本(帶詳細解析說明)和Flash導入導出批處理文件      http://www.cocoachina.com/bbs/read.php?tid-219173.html 贴子里面描述了<刀塔传奇>骨骼动画的文件格式,我是参考这个文件格式写出来的.我的实现思路是将*.fca文件转换成DragonBonesCPP所需要的格式,然后就可以通过D

制作手机使用的网页图片查看器

这几天抽空在为项目开发一个量身的图片查看器,目前已初步完成需求 开发场景是:在一个多文件下载展示列表中,如检测某些文件为图片时,则点击该文件时打开图片查看器展示该图片,并将列表内其它图片同时展示查看器队列内,可供前后滑动查看及其它附带功能 乍一听功能点似乎有点多而且有些复杂,需要梳理一下 功能点整理 首先,我们要获得点击的图片文件对象及符合条件的图片文件对象集 其次,图片查看器的制作及图片队列展示 然后,图片友好加载方式 最后,图片查看器触摸滑动及滑动后相关功能的实现 简单整理了一下,好像也不多