Руководство Eclipse JFace
View more Tutorials:
Убедитесь что у вас уже есть понятие о SWT, вам нужно создать Project SWT перед тем как начать с JFace. Вы можете посмотреть руководство SWT по ссылке:
Eclipse JFace это API основанный на SWT. JFace предоставляющий классы и платформу для упрощения использования SWT. JFace не скрывает API SWT. Поэтому, знание SWT все же является необходимой основой.
JFace помогает упростить:
- Упрощение модели данных и визуального отображения. Например данные отображенные на Table, ComboBox, Tree.
- JFace так же предоставляют классы helper для эффективного управления ваших систематических ресурсов, как цвет, изображение и шрифт.
- JFace помогает управлять Preference pages, wizard и Dialog. Он предоставляет свойства декорации иконок (icon decoration), и поддержка ввода пользователя (user-input) для SWT control.
JFace используется в приложениях Desktop и хорошо используется в приложениях RAP. В данной статье Demo инструктируются на приложении Desktop.

Мы создадим Project похожий на тот, что создали в статье руководства по использованию SWT.
- File/New/Project

- Project name: JFaceTutorial

Этот Project будет запущен на Desktop, вам нужно выбрать как в изображении ниже:


Ввести:
- Package name: org.o7planning.tutorial.jface

Project создан.

Вам нужно объявить некоторые требуемые Bundle, точнее OSGi SWT и JFace. Они являются библиотеками SWT & JFace.

Добавить Bundle:
- org.eclipse.swt

Продолжим добавление Bundle:
- org.eclipse.jface
- org.eclipse.jface.text


Только когда вы добавите 2 bundle JFace упомянутых выше в Project, на экране дизайна WindowBuilder только сейчас появляются компоненты JFace чтобы вы перетащили.

OK, теперь мы начнем с JFace.
Создать package:
- org.o7planning.tutorial.jface.image
- check.png:

- File/New/Other...

Ввести:
- Package: org.o7planning.tutorial.jface.rs
- Name: ResourceDemo

Сначала, посмотрите как управляет SWT ресурсами данных (Resource).



Автоматически создан класс SWTResourceManager. Это класс с утилитарными методами (method) для управления Image, Font, Color.

Далее поменяем цвет шрифта Button:


Посмотрите на генерированный код в классе ResourceDemo.
/** * Create contents of the window. */ protected void createContents() { shlResourceDemo = new Shell(); shlResourceDemo.setSize(336, 249); shlResourceDemo.setText("Resource Demo"); shlResourceDemo.setLayout(new RowLayout(SWT.HORIZONTAL)); Button btnButtonU = new Button(shlResourceDemo, SWT.NONE); btnButtonU.setFont(SWTResourceManager.getFont("Arial", 12, SWT.NORMAL)); btnButtonU.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE)); btnButtonU.setImage(SWTResourceManager.getImage(ResourceDemo.class, "/org/o7planning/tutorial/jface/image/check.png")); btnButtonU.setText("Button using SWT Resource Manager"); }
И теперь способ как JFace управляет ресурс данных (Resource).

import org.eclipse.jface.resource.FontDescriptor; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; // Create Resource Manager. LocalResourceManager jfaceRsManager = new LocalResourceManager( JFaceResources.getResources(), shlResourceDemo); Color color = jfaceRsManager.createColor(new RGB(200, 100, 0)); Font font = jfaceRsManager.createFont(FontDescriptor.createFrom( "Arial", 10, SWT.BOLD)); // Class in arguments, and image file is located on same Jar file. ImageDescriptor imageDescriptor = ImageDescriptor.createFromFile( ResourceDemo.class, "/org/o7planning/tutorial/jface/image/check.png"); Image image = jfaceRsManager.createImage(imageDescriptor);
Все коды ResourceDemo.
ResourceDemo.java
package org.o7planning.tutorial.jface.rs; import org.eclipse.jface.resource.FontDescriptor; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.wb.swt.SWTResourceManager; public class ResourceDemo { protected Shell shlResourceDemo; /** * Launch the application. * * @param args */ public static void main(String[] args) { try { ResourceDemo window = new ResourceDemo(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window. */ public void open() { Display display = Display.getDefault(); createContents(); shlResourceDemo.open(); shlResourceDemo.layout(); while (!shlResourceDemo.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } /** * Create contents of the window. */ protected void createContents() { shlResourceDemo = new Shell(); shlResourceDemo.setSize(336, 249); shlResourceDemo.setText("Resource Demo"); shlResourceDemo.setLayout(new RowLayout(SWT.HORIZONTAL)); Button btnButtonU = new Button(shlResourceDemo, SWT.NONE); btnButtonU.setFont(SWTResourceManager.getFont("Arial", 12, SWT.NORMAL)); btnButtonU.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE)); btnButtonU.setImage(SWTResourceManager.getImage(ResourceDemo.class, "/org/o7planning/tutorial/jface/image/check.png")); btnButtonU.setText("Button using SWT Resource Manager"); // Button button2 = new Button(shlResourceDemo, SWT.NONE); button2.setText("Button using JFace Resource Manager"); LocalResourceManager jfaceRsManager = new LocalResourceManager( JFaceResources.getResources(), shlResourceDemo); Color color = jfaceRsManager.createColor(new RGB(200, 100, 0)); Font font = jfaceRsManager.createFont(FontDescriptor.createFrom( "Arial", 10, SWT.BOLD)); ImageDescriptor imageDescriptor = ImageDescriptor.createFromFile( ResourceDemo.class, "/org/o7planning/tutorial/jface/image/check.png"); Image image = jfaceRsManager.createImage(imageDescriptor); button2.setFont(font); button2.setForeground(color); button2.setImage(image); } }

Decoration это Widget использующийся для декораций некоторых ситуаций для других Widget. Например чтобы отметиь поле Text необходимо ввести,...

- Package: org.o7planning.tutorial.jface.decoration
- Name: DecorationDemo





DecorationDemo.java
package org.o7planning.tutorial.jface.decoration; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import swing2swt.layout.FlowLayout; public class DecorationDemo { protected Shell shlDecorationDemo; private Text text; /** * Launch the application. * @param args */ public static void main(String[] args) { try { DecorationDemo window = new DecorationDemo(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window. */ public void open() { Display display = Display.getDefault(); createContents(); shlDecorationDemo.open(); shlDecorationDemo.layout(); while (!shlDecorationDemo.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } /** * Create contents of the window. */ protected void createContents() { shlDecorationDemo = new Shell(); shlDecorationDemo.setSize(327, 245); shlDecorationDemo.setText("Decoration Demo"); shlDecorationDemo.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); text = new Text(shlDecorationDemo, SWT.BORDER); ControlDecoration controlDecoration = new ControlDecoration(text, SWT.LEFT | SWT.TOP); controlDecoration.setDescriptionText("Some description"); Image image = FieldDecorationRegistry. getDefault(). getFieldDecoration(FieldDecorationRegistry.DEC_ERROR_QUICKFIX). getImage(); controlDecoration.setImage(image); } }
Результаты запуска класса DecorationDemo:

SWT предоставляет некоторые control:
- List
- Combo
- Table
- Tree
Его использование на самом деле сложно, и кодирование программы это длинно. Например при работе с Table, при отображении данных, вам нужно добавить каждый TableItem в Table. Каждый TableItem это строка (row) в Table. Добавление или убавление строк так же является длинной работой.

Принцип JFace это создать Viewer. Viewer обертывает control, поэтому вместо работы с control мы работаем с Viewer. Viewer помог вам скрыть обработку отображения данных. Вам нужно только предоставить Content Provider и Label Provider для viewer через метод.
- Viewer.setContentProvider(IContentProvider)
- Viewer.setLabelProvider(IBaseLabelProvider)
Настроить введенные данные для control через метод:
- Viewer.setInput(Object)
Включая:
Content Provider:
- Класс, выполняющий интерфейс IContentProvider, говорит Viewer как использовать введенные данные, отделить эти данные в массив Object, каждый Object это однострочные данные (в Table, Tree, Combo или List).
Label Provider:
- Класс, выполняющий интерфейс IBaseLabelProvider, говорит Viewer как из однострочной строки 1 Object, в определенном индексированном столбце (columnIndex) какой Image, Text отобразить.

Есть некоторые классы участвующие в примерах данной статьи, используются много раз.
Model:
AppMenu.java
package org.o7planning.tutorial.jface.model; import java.util.List; public class AppMenu { private String menuName; private String menuTitle; private List<AppMenu> children; public AppMenu(String menuName, String menuTitle, List<AppMenu> children) { this.menuName = menuName; this.menuTitle = menuTitle; this.children = children; } public String getMenuName() { return menuName; } public void setMenuName(String menuName) { this.menuName = menuName; } public String getMenuTitle() { return menuTitle; } public void setMenuTitle(String menuTitle) { this.menuTitle = menuTitle; } public List<AppMenu> getChildren() { return children; } }
Article.java
package org.o7planning.tutorial.jface.model; public class Article { private String title; private String author; private boolean published; public Article(String title, String author, boolean published) { this.title = title; this.author = author; this.published = published; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public boolean isPublished() { return published; } public void setPublished(boolean published) { this.published = published; } }
Employee.java
package org.o7planning.tutorial.jface.model; public class Employee { private String empNo; private String firstName; private String lastName; public Employee(String empNo, String firstName, String lastName) { this.empNo = empNo; this.firstName = firstName; this.lastName = lastName; } public String getEmpNo() { return empNo; } public void setEmpNo(String empNo) { this.empNo = empNo; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
Department.java
package org.o7planning.tutorial.jface.model; import java.util.List; public class Department { private String deptNo; private String deptName; private List<Employee> employees; public Department(String deptNo, String deptName, List<Employee> employees) { this.deptNo = deptNo; this.deptName = deptName; this.employees = employees; } public String getDeptNo() { return deptNo; } public void setDeptNo(String deptNo) { this.deptNo = deptNo; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public List<Employee> getEmployees() { return employees; } }
DataModel.java
package org.o7planning.tutorial.jface.model; import java.util.ArrayList; import java.util.List; public class DataModel { private static List<Article> articleList; private static List<Department> departmentList; private static List<AppMenu> appMenuList; public static List<Article> getArticles() { if (articleList == null) { articleList = new ArrayList<Article>(); articleList.add(new Article("Java basic", "Tom", true)); articleList .add(new Article("Hibernate for beginners", "Tran", true)); articleList.add(new Article("Maven for beginners", "Smith", false)); } return articleList; } public static List<Department> getDepartments() { if (departmentList == null) { Employee emp11 = new Employee("E11", "Michael", "Smith"); Employee emp12 = new Employee("E12", "Susan", "Barker"); List<Employee> empList1 = new ArrayList<Employee>(); empList1.add(emp11); empList1.add(emp12); Department dept1 = new Department("D01", "Operation", empList1); // Employee emp21 = new Employee("E21", "Robert", "Tyler"); List<Employee> empList2 = new ArrayList<Employee>(); empList2.add(emp21); Department dept2 = new Department("D02", "Adminstration", empList2); // departmentList = new ArrayList<Department>(); departmentList.add(dept1); departmentList.add(dept2); } return departmentList; } public static List<AppMenu> getAppMenus() { if (appMenuList == null) { appMenuList = new ArrayList<AppMenu>(); AppMenu appMenu31 = new AppMenu("ErrorLog", "Error Log", null); AppMenu appMenu32 = new AppMenu("ProjectExplorer", "Project Explorer", null); List<AppMenu> list3 = new ArrayList<AppMenu>(); list3.add(appMenu31); list3.add(appMenu32); AppMenu appMenu21 = new AppMenu("ShowView", "Show View", list3); AppMenu appMenu22 = new AppMenu("ClosePerspective", "Close perspective...", null); List<AppMenu> list2 = new ArrayList<AppMenu>(); list2.add(appMenu21); list2.add(appMenu22); AppMenu appMenu1 = new AppMenu("Window", "Window", list2); appMenuList.add(appMenu1); } return appMenuList; } }
Content/Label Provider:
AbstractComboContentLabelProvider.java
package org.o7planning.tutorial.jface.provider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; public abstract class AbstractComboContentLabelProvider implements IStructuredContentProvider, ILabelProvider { @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public void addListener(ILabelProviderListener listener) { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } @Override public Image getImage(Object element) { return null; } }
AbstractTableContentLabelProvider.java
package org.o7planning.tutorial.jface.provider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; public abstract class AbstractTableContentLabelProvider implements ITableLabelProvider, IStructuredContentProvider { @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public void addListener(ILabelProviderListener listener) { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } @Override public Image getColumnImage(Object element, int columnIndex) { return null; } }
AbstractTreeContentLabelProvider.java
package org.o7planning.tutorial.jface.provider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; public abstract class AbstractTreeContentLabelProvider implements ITreeContentProvider, ILabelProvider { @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public Object getParent(Object element) { return null; } @Override public void addListener(ILabelProviderListener listener) { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } @Override public Image getImage(Object element) { return null; } }
AbstractTreeTableContentLabelProvider.java
package org.o7planning.tutorial.jface.provider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; public abstract class AbstractTreeTableContentLabelProvider implements ITreeContentProvider, ITableLabelProvider { @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public void addListener(ILabelProviderListener listener) { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } @Override public Image getColumnImage(Object element, int columnIndex) { return null; } @Override public Object getParent(Object element) { return null; } }
С TableViewer. Content/Label Provider, который стоит использовать:
- Content Provider: implements IStructuredContentProvider
- Label Provider: implements ITableLabelProvider
- File/New/Other...

Ввести:
- Package: org.o7planning.tutorial.jface.tableviewer1
- Name: TableViewerDemo
- Select: protected createContents() method
- (The code will be generated in this method).

Настроить Layout là FillLayout для объекта shell выбирая иконку FillLayout и кликнуть на экран Shell.


Создать 2 столбца, выбирая иконку TableColumn и расположить на экране, одновременно изменить названия столбцов, как показано ниже.


Класс ArticleTableCLProvider расширенный из класса AbstractTableContentLabelProvider, имеет свойства Content Provider и Label Provider.
ArticleTableCLProvider.java
package org.o7planning.tutorial.jface.tableviewer1; import java.util.List; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.o7planning.tutorial.jface.model.Article; import org.o7planning.tutorial.jface.provider.AbstractTableContentLabelProvider; public class ArticleTableCLProvider extends AbstractTableContentLabelProvider { private Image image; public ArticleTableCLProvider() { LocalResourceManager jfaceRsManager = new LocalResourceManager( JFaceResources.getResources(), Display.getCurrent().getShells()[0]); ImageDescriptor imageDescriptor = ImageDescriptor.createFromFile( ArticleTableCLProvider.class, "/org/o7planning/tutorial/jface/image/check.png"); image = jfaceRsManager.createImage(imageDescriptor); } @Override public String getColumnText(Object element, int columnIndex) { Article article = (Article) element; switch (columnIndex) { // 0 - For first column case 0: return article.getTitle(); // 1 - For Second column case 1: return article.getAuthor(); default: return null; } } @Override public Image getColumnImage(Object element, int columnIndex) { Article article = (Article) element; switch (columnIndex) { // 0 - For first column case 0: if (article.isPublished()) { return image; } default: return null; } } // see: viewer.setInput(..) @Override public Object[] getElements(Object input) { List<Article> list = (List<Article>) input; return list.toArray(); } }
Открыть код класса TableViewerDemo, чтобы добавить некоторые коды.
// ArticleTableCLProvider provider = new ArticleTableCLProvider(); tableViewer.setContentProvider(provider); tableViewer.setLabelProvider(provider); // Set InputData for TableViewer. List<Article> articleList= DataModel.getArticles(); tableViewer.setInput(articleList);
Как в изображении ниже.

И этот результат запуска класса TableViewerDemo:

Полный код TableViewerDemo:
TableViewerDemo.java
package org.o7planning.tutorial.jface.tableviewer1; import java.util.List; public class TableViewerDemo { protected Shell shlTableviewerdemo; private Table table; /** * Launch the application. * @param args */ public static void main(String[] args) { try { TableViewerDemo window = new TableViewerDemo(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window. */ public void open() { Display display = Display.getDefault(); createContents(); shlTableviewerdemo.open(); shlTableviewerdemo.layout(); while (!shlTableviewerdemo.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } /** * Create contents of the window. */ protected void createContents() { shlTableviewerdemo = new Shell(); shlTableviewerdemo.setSize(366, 277); shlTableviewerdemo.setText("TableViewerDemo"); shlTableviewerdemo.setLayout(new FillLayout(SWT.HORIZONTAL)); TableViewer tableViewer = new TableViewer(shlTableviewerdemo, SWT.BORDER | SWT.FULL_SELECTION); // Content Provider & Label Provider. ArticleTableCLProvider provider = new ArticleTableCLProvider(); tableViewer.setContentProvider(provider); tableViewer.setLabelProvider(provider); table = tableViewer.getTable(); table.setLinesVisible(true); table.setHeaderVisible(true); TableColumn tblclmnNewColumn = new TableColumn(table, SWT.NONE); tblclmnNewColumn.setWidth(148); tblclmnNewColumn.setText("Article"); TableColumn tblclmnNewColumn_1 = new TableColumn(table, SWT.NONE); tblclmnNewColumn_1.setWidth(119); tblclmnNewColumn_1.setText("Author"); // Set input data to TableViewer List<Article> articleList= DataModel.getArticles(); tableViewer.setInput(articleList); } }
Случаи добавления, удаления строк данных в таблице.
// Get TableViewer data. List<Article> input = (List<Article>)tableViewer.getInput(); // Add row Article newArticle = .... ; input.add(newArticle); // Refresh row tableViewer.refresh(newArticle); // Or tableViewer.refresh(); // remove row input.remove(<article>); tableViewer.refresh();
С TreeViewer отобразить данные и Tree и Table. Content/Label Provider которые следует использовать:
- Content Provider: implements ITreeContentProvider
- Label Provider: implements ITableLabelProvider

Например:





DeptEmpTreeTableCLProvider.java
package org.o7planning.tutorial.jface.treetable1; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.o7planning.tutorial.jface.model.Department; import org.o7planning.tutorial.jface.model.Employee; import org.o7planning.tutorial.jface.provider.AbstractTreeTableContentLabelProvider; public class DeptEmpTreeTableCLProvider extends AbstractTreeTableContentLabelProvider { private Image EMP_IMAGE; private Image DEPT_IMAGE; public DeptEmpTreeTableCLProvider() { // Dùng tạm ảnh của có sẵn trong hệ thống để minh họa DEPT_IMAGE = Display.getCurrent().getSystemImage(SWT.ICON_INFORMATION); EMP_IMAGE = Display.getCurrent().getSystemImage(SWT.ICON_ERROR ); } @Override public Object[] getElements(Object inputElement) { List<Department> departments = (List<Department>) inputElement; return departments.toArray(); } @Override public Object[] getChildren(Object parentElement) { if (parentElement instanceof Department) { Department dept = (Department) parentElement; List<Employee> emps = dept.getEmployees(); return emps == null ? null : emps.toArray(); } else { // Employee has no children return null; } } @Override public boolean hasChildren(Object element) { if (element instanceof Department) { Department dept = (Department) element; List<Employee> emps = dept.getEmployees(); return emps != null && !emps.isEmpty(); } else { // Employee has no children return false; } } @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof Department) { Department dept = (Department) element; switch (columnIndex) { case 0: return dept.getDeptNo(); case 1: return dept.getDeptName(); default: return null; } } else { Employee emp = (Employee) element; switch (columnIndex) { case 2: return emp.getEmpNo(); case 3: return emp.getFirstName(); case 4: return emp.getLastName(); default: return null; } } } @Override public Image getColumnImage(Object element, int columnIndex) { if (element instanceof Department) { switch (columnIndex) { case 0: return DEPT_IMAGE; default: return null; } } else { switch (columnIndex) { case 2: return EMP_IMAGE; default: return null; } } } }
Изменить код TreeTableViewerDemo:

Просмотр всего кода класса TreeTableViewerDemo:
TreeTableViewerDemo.java
package org.o7planning.tutorial.jface.treetable1; import org.eclipse.swt.widgets.Display; public class TreeTableViewerDemo { protected Shell shlTreeTableViewer; /** * Launch the application. * @param args */ public static void main(String[] args) { try { TreeTableViewerDemo window = new TreeTableViewerDemo(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window. */ public void open() { Display display = Display.getDefault(); createContents(); shlTreeTableViewer.open(); shlTreeTableViewer.layout(); while (!shlTreeTableViewer.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } /** * Create contents of the window. */ protected void createContents() { shlTreeTableViewer = new Shell(); shlTreeTableViewer.setSize(438, 226); shlTreeTableViewer.setText("Tree Table Viewer"); shlTreeTableViewer.setLayout(new FillLayout(SWT.HORIZONTAL)); TreeViewer treeViewer = new TreeViewer(shlTreeTableViewer, SWT.BORDER); DeptEmpTreeTableCLProvider provider= new DeptEmpTreeTableCLProvider(); treeViewer.setContentProvider(provider); treeViewer.setLabelProvider(provider); Tree tree = treeViewer.getTree(); tree.setLinesVisible(true); tree.setHeaderVisible(true); TreeColumn trclmnDeptNo = new TreeColumn(tree, SWT.NONE); trclmnDeptNo.setWidth(71); trclmnDeptNo.setText("Dept No"); TreeColumn trclmnDeptName = new TreeColumn(tree, SWT.NONE); trclmnDeptName.setWidth(79); trclmnDeptName.setText("Dept Name"); TreeColumn trclmnEmpNo = new TreeColumn(tree, SWT.NONE); trclmnEmpNo.setWidth(69); trclmnEmpNo.setText("Emp No"); TreeColumn trclmnFirstName = new TreeColumn(tree, SWT.NONE); trclmnFirstName.setWidth(77); trclmnFirstName.setText("First Name"); TreeColumn trclmnLastName = new TreeColumn(tree, SWT.NONE); trclmnLastName.setWidth(100); trclmnLastName.setText("Last Name"); treeViewer.setInput(DataModel.getDepartments()); } }
Результаты запуска примера:

Добавить удалить строку данных на TreeViewer
// Get data of TreeViewer. List<Department> input = (List<Department>)treeViewer.getInput(); Department dept = input.get(0); List<Employee> empList = dept.getEmployees(); // Add employee for Department. empList.add(newEmployee); // Refresh treeViewer.refresh(dept); // or treeViewer.refresh(); // Remove row similar.
С TreeViewer который отображает данные и как Tree и как Table. Content/Label Provider который стоит использовать это:
- Content Provider: implements ITreeContentProvider
- Label Provider: implements ITableLabelProvider
В случае Tree (Есть 1 столбец, который не является Table):
- Content Provider: implements ITreeContentProvider
- Label Provider: implements ILabelProvider
Примечание: Интерфейс ITableLabelProvider расширенный из интерфейса ILabelProvider

Например:



Вы можете добавить 1 TreeColumn в Tree. Или не нужно никакого TreeColumn. В изображении ниже я использую Tree без TreeColumn.
При Tree имеющего Column, вы можете дать название столбцу, но во многих случаях это ненужно.

AppMenuTreeCLProvider.java
package org.o7planning.tutorial.jface.treeviewer1; import java.util.List; import org.o7planning.tutorial.jface.model.AppMenu; import org.o7planning.tutorial.jface.provider.AbstractTreeContentLabelProvider; public class AppMenuTreeCLProvider extends AbstractTreeContentLabelProvider { @Override public String getText(Object element) { AppMenu appMenu= (AppMenu) element; return appMenu.getMenuTitle(); } @Override public Object[] getElements(Object inputElement) { List<AppMenu> menus = (List<AppMenu>) inputElement; return menus.toArray(); } @Override public Object[] getChildren(Object parentElement) { AppMenu menu= (AppMenu) parentElement; List<AppMenu> children= menu.getChildren(); return children== null? null: children.toArray(); } @Override public boolean hasChildren(Object element) { AppMenu menu= (AppMenu) element; List<AppMenu> children= menu.getChildren(); return children!= null&&!children.isEmpty(); } }
TreeViewerDemo.java
package org.o7planning.tutorial.jface.treeviewer1; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.o7planning.tutorial.jface.model.DataModel; public class TreeViewerDemo { protected Shell shlTreeviewerDemo; /** * Launch the application. * @param args */ public static void main(String[] args) { try { TreeViewerDemo window = new TreeViewerDemo(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window. */ public void open() { Display display = Display.getDefault(); createContents(); shlTreeviewerDemo.open(); shlTreeviewerDemo.layout(); while (!shlTreeviewerDemo.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } /** * Create contents of the window. */ protected void createContents() { shlTreeviewerDemo = new Shell(); shlTreeviewerDemo.setSize(246, 202); shlTreeviewerDemo.setText("TreeViewer Demo"); shlTreeviewerDemo.setLayout(new FillLayout(SWT.HORIZONTAL)); TreeViewer treeViewer = new TreeViewer(shlTreeviewerDemo, SWT.BORDER); AppMenuTreeCLProvider provider= new AppMenuTreeCLProvider(); treeViewer.setContentProvider(provider); treeViewer.setLabelProvider(provider); Tree tree = treeViewer.getTree(); tree.setLinesVisible(true); tree.setHeaderVisible(true); treeViewer.setInput(DataModel.getAppMenus()); } }
Результаты запуска примера:

Добавление, удаление данных на TreeViewer
// Get data of TreeViewer. List<AppMenu> input = (List<AppMenu>)treeViewer.getInput(); AppMenu menu = input.get(0); List<AppMenu> childMenus = menu.getChildren(); // add AppMenu childMenus .add(newAppMenu); // Refresh treeViewer.refresh(menu ); // or treeViewer.refresh(); // Remove row similar.

- Package: org.o7planning.tutorial.jface.cbtableviewer
- Name: CheckboxTableViewerDemo

- TODO...