之前用的是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 }