Руководство Eclipse JFace
1. Что такое JFace?
Убедитесь что у вас уже есть понятие о 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.
3. Создать Project
Мы создадим 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.
4. Управление Resource
Создать package:
- org.o7planning.tutorial.jface.image
- check.png:
- File/New/Other...
Ввести:
- Package: org.o7planning.tutorial.jface.rs
- Name: ResourceDemo
Как SWT управляет Resource
Сначала, посмотрите как управляет 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
И теперь способ как 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);
}
}
5. Использование Control Decoration
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:
6. JFace Viewer
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 отобразить.
Некоторые классы, участвующие в demo
Есть некоторые классы участвующие в примерах данной статьи, используются много раз.
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;
}
}
JFace TableViewer
С 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();
JFace Tree Table Viewer
С 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.
JFace TreeViewer
С 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.
JFace CheckboxTableViewer
- Package: org.o7planning.tutorial.jface.cbtableviewer
- Name: CheckboxTableViewerDemo
- TODO...
Технология Eclipse
- Установите Tycho для Eclipse
- Руководство Java OSGi для начинающих
- Создайте проект Java OSGi с Maven и Tycho
- Установите WindowBuilder для Eclipse
- Какую платформу я должен выбрать для разработки приложений Java Desktop?
- Программирование приложения Java Desktop с использованием SWT
- Руководство Eclipse JFace
- Установить Eclipse RAP Target Platform
- Установите RAP e4 Tooling для Eclipse
- Создать Eclipse RAP Widget из ClientScripting-based widget
- Руководство Eclipse RCP 4 для начинающих - e4 Workbench Application
- Установите RAP Tools для Eclipse
- Руководство Eclipse RAP для начинающих - приложение e4 Workbench
Show More