JFace TableViewer Note
来源:互联网 发布:第一创业证券待遇 知乎 编辑:程序博客网 时间:2024/05/16 04:53
1. JFace Table Viewer
1.1. TableViewer
You can use the TableViewer
class to create tables using the JFace framework. The SWT Table
widget is wrapped into the TableViewer
and can still be accessed to set its properties.
// Define the TableViewerviewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);// Create the columns // Not yet implementedcreateColumns(parent);// Make lines and make header visiblefinal Table table = viewer.getTable();table.setHeaderVisible(true);table.setLinesVisible(true);
1.2. ContentProvider for TableViewer
As with other JFace Viewers the ContentProvider
provides the data which should be displayed in theTableViewer
.
You can implement your own ContentProvider
for a table by implementing the interface IStructuredContentProvider
from the org.eclipse.jface.viewers
package.
Eclipse provides an implementation of this interface via the ArrayContentProvider
class. The ArrayContentProvider
classsupports Arrays or Lists as input, containing the domain data. Because ArrayContentProviders
do not store any data, it is possible to share an instances with several Viewers. To get a shared instance use the ArrayContentProvider.getInstance()
method.
The getElements()
method of the ContentProvider
is called by the JFace table Viewer
to translate the input into an array of elements. These elements are displayed as individual elements by the TableViewer
, i.e. as individual rows.
The input to the ContentProvider
is set via the setInput()
method of the Viewer
class.
// Continued after the definition of // the Viewer// Set the ContentProviderviewer.setContentProvider(ArrayContentProvider.getInstance());// Get the content for the Viewer,// setInput will call getElements in the ContentProviderviewer.setInput(someData...);
1.3. Columns and LabelProviders
Columns for a JFace TableViewer
are defined by creating instances of TableViewerColumn
.
Each TableViewerColumn
needs to get a LabelProvider
assigned via the setLabelProvider()
method. The LabelProvider
defines how the data from the model will be displayed. Typically you return the String which should be displayed.
The setLabelProvider()
method expects an instance of theabstract CellLabelProvider
class.A default implementation of this class is provided by the ColumnLabelProvider
class.
// First column is for the first nameTableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE);col.getColumn().setWidth(200);col.getColumn().setText("Firstname:");col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Person p = (Person) element; return p.getFirstName(); }});// Maybe more text columns...// Now the status married// Uses an getImage instead o getText// CHECKED and UNCHECK are fields of type Imagecol = new TableViewerColumn(viewer, SWT.NONE);col.getColumn().setWidth(200);col.getColumn().setText("Married:");col.setLabelProvider(new ColumnLabelProvider() {@Overridepublic Image getImage(Object element) { if (((Person) element).isMarried()) { return CHECKED; } return UNCHECKED; }});
The above code uses two fields which contain Image
instances. These fields could for example be initialized via the following code.Using the classes in this code requires a dependency to the org.eclipse.core.runtime
plug-in.
// Fields for your class// Assuming your have these two icons// in your icons folderprivate static final Image CHECKED = getImage("checked.gif");private static final Image UNCHECKED = getImage("unchecked.gif");// More code...// Helper Method to load the imagesprivate static Image getImage(String file) { Bundle bundle = FrameworkUtil.getBundle(View.class); URL url = FileLocator.find(bundle, new Path("icons/" + file), null); ImageDescriptor image = ImageDescriptor.createFromURL(url); return image.createImage();}
1.4. Reflect data changes in the Viewer
To reflect data changes in the data model that is displayed by the Viewer
, you can call the viewer.refresh()
method. This method will update the Viewer
based on the data which was assigned to it.
To change the data which is displayed use the viewer.setInput()
method.
1.5. Selection change listener
Via the addSelectionChangedListener
method you can add a listener to a viewer. This listener is of the ISelectionChangedListener
type. The following code shows an example that gets the selected element of the viewer.
viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); Object firstElement = selection.getFirstElement(); // Do something with it }});
2. Prerequisites
The following provides an example how to build a table with the JFace Viewer framework.
It assume that you are familiar with creating Eclipse RCP applications or Eclipse Plug-ins .
Please see Introduction to JFace for an introduction to the concepts behind this example.
3. Tutorial: JFace Table Viewer
3.1. Overview of the example
We will build an Eclipse RCP application which displays data of persons in a JFace table. Each person is displayed in one individual row. This tutorial the basic setup of a JFace Table.
The final application will look like this.
3.2. Project creation and data model
Create a new RCP Project de.vogella.jface.tableviewer
using the "RCP application with a view" as a template. Create a package "de.vogella.jface.tableviewer.model" and the following class "Person".
package de.vogella.jface.tableviewer.model;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeSupport;public class Person { private String firstName; private String lastName; private boolean married; private String gender; private Integer age; private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); public Person() { } public Person(String firstName, String lastName, String gender, boolean married) { super(); this.firstName = firstName; this.lastName = lastName; this.gender = gender; this.married = married; } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } public String getFirstName() { return firstName; } public String getGender() { return gender; } public String getLastName() { return lastName; } public boolean isMarried() { return married; } public void setFirstName(String firstName) { propertyChangeSupport.firePropertyChange("firstName", this.firstName, this.firstName = firstName); } public void setGender(String gender) { propertyChangeSupport.firePropertyChange("gender", this.gender, this.gender = gender); } public void setLastName(String lastName) { propertyChangeSupport.firePropertyChange("lastName", this.lastName, this.lastName = lastName); } public void setMarried(boolean isMarried) { propertyChangeSupport.firePropertyChange("married", this.married, this.married = isMarried); } public Integer getAge() { return age; } public void setAge(Integer age) { propertyChangeSupport.firePropertyChange("age", this.age, this.age = age); } @Override public String toString() { return firstName + " " + lastName; }}
The class "Person" represents the data model for this example.It has also propertyChange support, which is not necessary for this example but is nice if you would later extend this example with Eclipse Databinding support.
Create the ModelProvider
class which is a in-memory representation of your data.This class is defined as a Singleton.
package de.vogella.jface.tableviewer.model;import java.util.ArrayList;import java.util.List;public enum ModelProvider { INSTANCE; private List<Person> persons; private ModelProvider() { persons = new ArrayList<Person>(); // Image here some fancy database access to read the persons and to // put them into the model persons.add(new Person("Rainer", "Zufall", "male", true)); persons.add(new Person("Reiner", "Babbel", "male", true)); persons.add(new Person("Marie", "Dortmund", "female", false)); persons.add(new Person("Holger", "Adams", "male", true)); persons.add(new Person("Juliane", "Adams", "female", true)); } public List<Person> getPersons() { return persons; }}
3.3. Define the viewer
Change the class "View.java" to the following.
package de.vogella.jface.tableviewer;import org.eclipse.jface.viewers.ArrayContentProvider;import org.eclipse.jface.viewers.ColumnLabelProvider;import org.eclipse.jface.viewers.TableViewer;import org.eclipse.jface.viewers.TableViewerColumn;import org.eclipse.swt.SWT;import org.eclipse.swt.graphics.Image;import org.eclipse.swt.layout.GridData;import org.eclipse.swt.layout.GridLayout;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Label;import org.eclipse.swt.widgets.Table;import org.eclipse.swt.widgets.TableColumn;import org.eclipse.swt.widgets.Text;import org.eclipse.ui.part.ViewPart;import de.vogella.jface.tableviewer.model.ModelProvider;import de.vogella.jface.tableviewer.model.Person;public class View extends ViewPart { public static final String ID = "de.vogella.jface.tableviewer.view"; private TableViewer viewer; // We use icons private static final Image CHECKED = Activator.getImageDescriptor("icons/checked.gif").createImage(); private static final Image UNCHECKED = Activator.getImageDescriptor("icons/unchecked.gif").createImage(); public void createPartControl(Composite parent) { GridLayout layout = new GridLayout(2, false); parent.setLayout(layout); Label searchLabel = new Label(parent, SWT.NONE); searchLabel.setText("Search: "); final Text searchText = new Text(parent, SWT.BORDER | SWT.SEARCH); searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); createViewer(parent); } private void createViewer(Composite parent) { viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); createColumns(parent, viewer); final Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); viewer.setContentProvider(new ArrayContentProvider()); // Get the content for the viewer, setInput will call getElements in the // contentProvider viewer.setInput(ModelProvider.INSTANCE.getPersons()); // Make the selection available to other views getSite().setSelectionProvider(viewer); // Set the sorter for the table // Layout the viewer GridData gridData = new GridData(); gridData.verticalAlignment = GridData.FILL; gridData.horizontalSpan = 2; gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; gridData.horizontalAlignment = GridData.FILL; viewer.getControl().setLayoutData(gridData); } public TableViewer getViewer() { return viewer; } // This will create the columns for the table private void createColumns(final Composite parent, final TableViewer viewer) { String[] titles = { "First name", "Last name", "Gender", "Married" }; int[] bounds = { 100, 100, 100, 100 }; // First column is for the first name TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], 0); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Person p = (Person) element; return p.getFirstName(); } }); // Second column is for the last name col = createTableViewerColumn(titles[1], bounds[1], 1); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Person p = (Person) element; return p.getLastName(); } }); // Now the gender col = createTableViewerColumn(titles[2], bounds[2], 2); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Person p = (Person) element; return p.getGender(); } }); // // Now the status married col = createTableViewerColumn(titles[3], bounds[3], 3); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return null; } @Override public Image getImage(Object element) { if (((Person) element).isMarried()) { return CHECKED; } else { return UNCHECKED; } } }); } private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) { final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); final TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setWidth(bound); column.setResizable(true); column.setMoveable(true); return viewerColumn; }/** * Passing the focus request to the viewer's control. */public void setFocus() { viewer.getControl().setFocus(); }}
The method createColumns create the table columns, headers, sets the size of the columns and makes the columns re-sizable.
createTableViewerColumn()
has three parameters. The third is currently not used, but we will use it in theadvanced tutorial .
3.4. Run
Run the example. The application should display a non-working search field and a table.
4. Advanced JFace Table
For more options on configuring your JFace Table please see Eclipse JFace Table Advanced Tutorial
This tutorial explains advanced usage of the JFace TableViewer including inline table editing, table filtering and sorting, and model / view interaction. StyledLabelProvider are also discussed.
5. Thank you
Please help me to support this article:
6. Questions and Discussion
Before posting questions, please see the vogella FAQ. If you have questions or find an error in this article please use the www.vogella.com Google Group. I have created a short list how to create good questions which might also help you.
7. Download
http://www.vogella.com/articles/EclipseJFaceTable/download/checkedpics.zip The checkbox pictures for the JFace Labelprovider
8. Links and Literature
8.1. Source Code
Source Code of Examples
8.2. JFace Resources
Eclipse JFace
JFace Tree Tutorial
JFace Data Binding
http://www.eclipse.org/articles/Article-Table-viewer/table_viewer.html Building and delivering a table editor with SWT/JFace
- JFace TableViewer Note
- Swt/Jface tableviewer总结
- Swt/Jface tableViewer入门教程一(显示tableViewer)
- Swt/Jface tableViewer入门教程一(显示tableViewer)
- java基础 ---JFace中的TableViewer
- Swt/Jface tableViewer入门教程1
- Swt/Jface tableViewer入门教程2
- Swt/Jface tableviewer入门教程3
- Swt/Jface tableviewer入门教程4
- JFace - 分析TableViewer的设计
- Swt/Jface tableViewer总结(二)
- Swt/Jface tableViewer总结(三)
- Swt/Jface tableViewer总结(四)
- Swt/Jface tableViewer总结(五)
- Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
- Swt/Jface tableViewer入门教程(显示tableViewer) 转 受益匪浅
- JFace 可编辑的TreeViewer和TableViewer
- Legacy Study notes(Jface、SWT-TableViewer)
- 【7种方法设置防火墙发挥最大功效】
- 游戏设计个人心得(一)
- Ice.Application 类
- 《STL 源码剖析读书笔记(一)》-----迭代器概念与trais编程技法
- 求字符串的长度 串联接函数 串联接函数
- JFace TableViewer Note
- Broken Necklace
- Metro
- 【解决病毒阻止用户进入安全模式方法】
- 关于apache下的一个StringUtils工具类的介绍
- Win8开启休眠的终极方法
- stringstream的用法详解
- JPasswordField 中得到的字符数组转化为字符串(密码乱码问题)
- Code Fragment- 批量的数据处理放到额外的线程里