The document provides an overview of using JFace to build cross-platform user interfaces in Java. It discusses how JFace includes convenience classes for building SWT applications and a framework for displaying and editing business model objects using SWT widgets like TableViewer and TreeViewer. It then walks through an example of using these components to build a to-do list application, including creating model objects, initializing the TableViewer, and implementing the various event handler objects like ContentProvider, LabelProvider, CellEditor, CellModifier, and RowSorter.
2. A bunch of convenience classes for
building SWT applications
ApplicationWindow
Dialog
Wizard
A framework for displaying and editing
Java business model objects using SWT
TableViewer
TreeViewer
Introduction to Jface| By Rahul Shukla 2
3. A bunch of convenience classes for
building SWT applications
ApplicationWindow
Dialog
Wizard
A framework for displaying and editing
Java business model objects using SWT
TableViewer
TreeViewer
Introduction to Jface| By Rahul Shukla 3
4. Hello, JFace
public class HelloJFace extends ApplicationWindow {
public HelloJFace(Shell parentShell) {
super(parentShell);
setBlockOnOpen(true);
}
public static void main(String[] args) {
(new HelloJFace(null)).open();
}
}
Introduction to Jface| By Rahul Shukla 4
6. Ways to add features to your JFace
application:
Add code to constructor
Override protected methods
Add new methods or classes
Introduction to Jface| By Rahul Shukla 6
7. Add menu bar, tool bar, status line
public class HelloJFace extends ApplicationWindow
{
public HelloJFace(Shell parentShell) {
super(parentShell);
setBlockOnOpen(true);
}
public static void main(String[] args) {
(new HelloJFace(null)).open();
}
}
Introduction to Jface| By Rahul Shukla 7
8. Add menu bar, tool bar, status line
public class HelloJFace extends ApplicationWindow {
public HelloJFace(Shell parentShell) {
super(parentShell);
setBlockOnOpen(true);
addMenuBar();
addToolBar(SWT.FLAT);
addStatusLine();
}
public static void main(String[] args) {
(new HelloJFace(null)).open();
}
}
Introduction to Jface| By Rahul Shukla 8
9. Add application title and icon
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Hello, JFace");
shell.setImage(
ImageDescriptor.createFromFile(
HelloJFace.class,
"icons/app.png").createImage());
}
Introduction to Jface| By Rahul Shukla 9
10. Add menu to menu bar
protected MenuManager createMenuManager() {
MenuManager menuManager = new MenuManager();
menuManager.add(createFileMenu());
return menuManager;
}
private MenuManager createFileMenu() {
MenuManager menu = new MenuManager("&File");
menu.add(new Action() {
public String getText() {
return "E&xit";
}
public void run() {
getShell().close();
} });
return menu;
}
Introduction to Jface| By Rahul Shukla 10
11. Add button to tool bar
protected ToolBarManager createToolBarManager(
int style)
{
ToolBarManager toolBar = new
ToolBarManager(style);
toolBar.add(new NewAction());
return toolBar;
}
Introduction to Jface| By Rahul Shukla 11
12. Add private class NewAction for button
private class NewAction extends Action {
public String getText() { return "New"; }
public String getToolTipText() { return "New"; }
public ImageDescriptor getImageDescriptor() {
ImageDescriptor imageDesc =
ImageDescriptor.createFromFile(
HelloJFace.class, "icons/new.png");
return imageDesc;
}
public ImageDescriptor getHoverImageDescriptor() {
ImageDescriptor imageDesc =
ImageDescriptor.createFromFile(
HelloJFace.class, "icons/new-h.png");
return imageDesc;
}
public void run() { // add action code here
}
}
Introduction to Jface| By Rahul Shukla 12
13. Suppose we really want to build a To-do
list...
Introduction to Jface| By Rahul Shukla 13
14. A bunch of convenience classes for
building SWT applications
ApplicationWindow
Dialog
Wizard
A framework for displaying and editing
Java business model objects using SWT
TableViewer
TreeViewer
Introduction to Jface| By Rahul Shukla 14
15. Steps to add to-do list editor to
application
Create TodoList model objects
Add TableViewer object to layout
Initialize TableViewer
Set TodoList object as the TableViewer's input
Write (or reuse existing classes) to specify the
following TableViewer event handler objects
ContentProvider, LabelProvider
CellEditor, CellModifier
RowSorter
Introduction to Jface| By Rahul Shukla 15
16. JFace TableViewer usage
TableViewerTodoList
TreeMapTodo
input
Introduction to Jface| By Rahul Shukla 16
17. JFace TableViewer usage
TableViewerTodoList
Todo
input
ContentProvider
LabelProvider
RowSorter
CellEditor
CellModifier
Introduction to Jface| By Rahul Shukla 17
18. Steps to add to-do list editor to application
Create TodoList model objects
Add TableViewer object to layout
Initialize TableViewer
Set TodoList object as the TableViewer's input
Write (or reuse existing classes) to specify the
following TableViewer event handler objects
ContentProvider, LabelProvider
CellEditor, CellModifier
RowSorter
Introduction to Jface| By Rahul Shukla 18
19. Create TodoList model object
public class TodoList implements Serializable {
public static List<Todo> list = new ArrayList<Todo>();
public static void addTodo(Todo todo) {
list.add(todo);
}
}
Introduction to Jface| By Rahul Shukla 19
20. Steps to add to-do list editor to
application
Create TodoList model object
Add TableViewer object to layout
Initialize TableViewer
Set TodoList object as the TableViewer's input
Write (or reuse existing classes) to specify the
following TableViewer event handler objects
ContentProvider, LabelProvider
CellEditor, CellModifier
RowSorter
Introduction to Jface| By Rahul Shukla 20
21. Add TableViewer object to layout
protected Control createContents(Composite parent)
{
return contents;
}
Introduction to Jface| By Rahul Shukla 21
22. Add TableViewer object to layout
protected Control createContents(Composite parent) {
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = 20;
layout.marginWidth = 20;
contents.setLayout(layout);
TableViewer viewer = new TableViewer(contents, SWT.BORDER |
SWT.H_SCROLL | SWT.V_SCROLL |
SWT.FULL_SELECTION);
viewer.getTable().setLayoutData(
new GridData(GridData.FILL_BOTH));
return contents;
}
Introduction to Jface| By Rahul Shukla 22
23. Steps to add to-do list editor to
application
Create TodoList model object
Add TableViewer object to layout
Initialize TableViewer
Set TodoList object as the TableViewer's input
Write (or reuse existing classes) to specify the
following TableViewer event handler objects
ContentProvider, LabelProvider
CellEditor, CellModifier
RowSorter
Introduction to Jface| By Rahul Shukla 23
24. Initialize TableViewer...
protected Control createContents(Composite parent) {
Composite contents = new Blotter(parent, SWT.NULL);
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = 20;
layout.marginWidth = 20;
contents.setLayout(layout);
viewer = new TableViewer(contents, SWT.BORDER |
SWT.H_SCROLL
| SWT.V_SCROLL | SWT.FULL_SELECTION);
viewer.getTable().setLayoutData(new
GridData(GridData.FILL_BOTH));
init();
return contents;
} Introduction to Jface| By Rahul Shukla 24
25. JFace TableViewer usage
TableViewerTodoList
TreeMapTodo
input
ContentProvider
LabelProvider
RowSorter
CellEditor
CellModifier
Introduction to Jface| By Rahul Shukla 25
26. Implement addProvidersAndEditors()
private void addProvidersAndEditors() {
table.setContentProvider(
new ContentProvider());
table.setLabelProvider(new LabelProvider());
CellEditor[] editors = {
new CheckboxCellEditor(table.getTable()),
new TextCellEditor(table.getTable()),
new TextCellEditor(table.getTable())};
table.setCellEditors(editors);
table.setCellModifier(new CellModifier());
table.setSorter(new RowSorter());
table.setColumnProperties(colNames);
}
Introduction to Jface| By Rahul Shukla 27
27. Steps to add to-do list editor to
application
Create TodoList model object
Add TableViewer object to layout
Initialize TableViewer
Set TodoList object as the TableViewer's input
Write (or reuse existing classes) to specify the
following TableViewer event handler objects
ContentProvider, LabelProvider
CellEditor, CellModifier
RowSorter
Introduction to Jface| By Rahul Shukla 28
28. Set TodoList as the TableViewer's input
private void init() {
addColumns();
addProviders();
addEditors();
viewer.setInput(TodoList.list);
}
Introduction to Jface| By Rahul Shukla 29
29. Set TodoList as the TableViewer's input
private void initTable() {
addColumns();
addProvidersAndEditors();
table.setInput(TodoList.theList);
}
private static final String[] colNames =
{ "Done", "Priority", "Description" };
private static final int[] colWeight =
{ 5, 5, 90 };
private static final int COL_DONE = 0;
private static final int COL_PRIORITY = 1;
private static final int COL_DESC = 2;
Introduction to Jface| By Rahul Shukla 30
30. Steps to add to-do list editor to
application
Create TodoList model object
Add TableViewer object to layout
Initialize TableViewer
Set TodoList object as the TableViewer's input
Write (or reuse existing classes) to specify the
following TableViewer event handler objects
ContentProvider, LabelProvider
CellEditor, CellModifier
RowSorter
Introduction to Jface| By Rahul Shukla 31
31. Implement addProvidersAndEditors()
private void addProviders() {
viewer.setContentProvider(new MyContentProvider());
viewer.setLabelProvider(new MyTableLabelProvider());
}
private void addEditors() {
Table table = viewer.getTable();
CellEditor[] editors = { new
CheckboxCellEditor(table),
new TextCellEditor(table), new TextCellEditor(table)
};
viewer.setCellEditors(editors);
viewer.setCellModifier(new CellModifier(columns,
this));
viewer.setColumnProperties(columns);Introduction to Jface| By Rahul Shukla 32
32. JFace TableViewer usage
TableViewerTodoList
TreeMapTodo
input
ContentProvider
LabelProvider
RowSorter
CellEditor
CellModifier
Introduction to Jface| By Rahul Shukla 33
33. A closer look at JFace event handler
objects
Event Handler When Triggered
ContentProvider On setInput(), refresh(), update()
LabelProvider A cell needs redrawing
CellEditor Edit cell value
CellModifier Fetch editable value / store value
RowSorter On table redraw
Introduction to Jface| By Rahul Shukla 34
34. A closer look at JFace event handler
objects
Event Handler When Triggered
ContentProvider On setInput(), refresh(), update()
LabelProvider A cell needs redrawing
CellEditor Edit cell value
CellModifier Fetch editable value / store value
RowSorter On table redraw
Introduction to Jface| By Rahul Shukla 35
35. Implementing ContentProvider
private class ContentProvider
implements IStructuredContentProvider
{
public Object[] getElements(
Object inputElement)
{
return ((TodoList)inputElement).toArray();
}
public void dispose() {}
public void inputChanged(Viewer viewer,
Object oldInput, Object newInput) {}
}
Introduction to Jface| By Rahul Shukla 36
36. JFace TableViewer usage
TableViewerTodoList
TreeMapTodo
input
ContentProvider
LabelProvider
RowSorter
CellEditor
CellModifier
Introduction to Jface| By Rahul Shukla 37
37. A closer look at JFace event handler
objects
Event Handler When Triggered
ContentProvider On setInput(), refresh(), update()
LabelProvider A cell needs redrawing
CellEditor Edit cell value
CellModifier Fetch editable value / store value
RowSorter On table redraw
Introduction to Jface| By Rahul Shukla 38
38. Implementing LabelProvider
private class LabelProvider
implements ITableLabelProvider {
private Image done;
private Image notdone;
public LabelProvider() {
done = ImageDescriptor.createFromFile(
TodoListWindow.class,
"icons/task-done.png").createImage();
notdone = ImageDescriptor.createFromFile(
TodoListWindow.class,
"icons/task-open.png").createImage();
}
// <continued/>...
Introduction to Jface| By Rahul Shukla 39
39. Implementing LabelProvider
public Image getColumnImage(Object element, int
columnIndex) {
Todo todo = (Todo) element;
switch (columnIndex) {
case 0:
if (todo.isDone())
return ImageDescriptor.createFromFile(HelloJFace.class,
"icons/done.gif").createImage();
else
return null;
default:
return null;
}
}
// <continued/>...
Introduction to Jface| By Rahul Shukla 40
40. Implementing LabelProvider
public String getColumnText(Object element, int
columnIndex) {
Todo todo = (Todo) element;
switch (columnIndex) {
case 1:
return String.valueOf(todo.getPriority());
case 2:
return String.valueOf(todo.getDesc());
default:
return null;
}
} // <continued/>...
Introduction to Jface| By Rahul Shukla 41
41. A closer look at JFace event handler
objects
Event Handler When Triggered
ContentProvider On setInput(), refresh(), update()
LabelProvider A cell needs redrawing
CellEditor Edit cell value
CellModifier Fetch editable value / store value
RowSorter On table redraw
Introduction to Jface| By Rahul Shukla 42
42. JFace TableViewer usage
TableViewerTodoList
TreeMap
Todo
input
ContentProvider
LabelProvider
RowSorter
CellEditor
CellModifier
Introduction to Jface| By Rahul Shukla 43
43. JFace TableViewer usage
TableViewerTodoList
Todo
input
ContentProvider
LabelProvider
RowSorter
CellEditor
CellModifier
The visible editor
Introduction to Jface| By Rahul Shukla 44
44. JFace TableViewer usage
TableViewerTodoList
Todo
input
ContentProvider
LabelProvider
RowSorter
CellEditor
CellModifier
Translates between
visible editor's
data type and the
model's storage
data type
Introduction to Jface| By Rahul Shukla 45
45. Implementing CellModifier
private class CellModifier
implements ICellModifier
{
public boolean canModify(Object element, String
property) {
return true;
}
// <continued/>...
Introduction to Jface| By Rahul Shukla 46
46. Implementing CellModifier
public Object getValue(Object element, String property) {
Todo todo = (Todo) element;
if (property.equals(columns[0])) {
return new Boolean(todo.isDone());
} else if (property.equals(columns[1])) {
return Integer.toString(todo.getPriority());
} else if (property.equals(columns[2])) {
return todo.getDesc();
}
return null;
}
Introduction to Jface| By Rahul Shukla 47
47. Implementing CellModifier
public void modify(Object element, String property, Object value) {
Item item = (Item) element;
Todo todo = (Todo) item.getData();
if (property.equals(columns[0])) {
boolean val = ((Boolean) value).booleanValue();
todo.setDone(val);
} else if (property.equals(columns[1])) {
int parseInt;
try {
parseInt = Integer.parseInt((String) value);
todo.setPriority(parseInt);
} catch (Exception e) {
MessageDialog.openError(window.getShell(), "Error", value
+ " is not a number");
}
} else if (property.equals(columns[2])) {
todo.setDesc((String) value);
}
window.refresh();
} Introduction to Jface| By Rahul Shukla 48
48. A closer look at JFace event handler
objects
Event Handler When Triggered
ContentProvider On setInput(), refresh(), update()
LabelProvider A cell needs redrawing
CellEditor Edit cell value
CellModifier Fetch editable value / store value
RowSorter On table redraw
Introduction to Jface| By Rahul Shukla 49
49. Implementing RowSorter
private class RowSorter extends ViewerSorter {
public int compare(Viewer viewer,
Object element1, Object element2) {
Todo t1 = (Todo) element1;
Todo t2 = (Todo) element2;
return t1.getPriority() -
t2.getPriority();
}
}
Introduction to Jface| By Rahul Shukla 50
50. A closer look at JFace event handler
objects
Event Handler When Required
ContentProvider Always
LabelProvider Always
CellEditor If grid is not read-only
CellModifier If grid is not read-only
RowSorter If grid is sorted
Introduction to Jface| By Rahul Shukla 51
51. So here's what we just built...
Introduction to Jface| By Rahul Shukla 52