代码如下:
实现1:
BugTracker.java
复制代码代码如下:
package swt_jface.demo6;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
public class BugTracker {
Display display = new Display();
Shell shell = new Shell(display);
Table table;
Image bugIcon = new Image(shell.getDisplay(), "C:/icons/bug.gif");
public BugTracker() {
GridLayout gridLayout = new GridLayout();
shell.setLayout(gridLayout);
shell.setText("Bug Tracking System");
Action actionAddNew = new Action("New bug") {
public void run() {
TableItem item = new TableItem(table, SWT.NULL);
item.setImage(bugIcon);
table.select(table.getItemCount() - 1);
}
};
Action actionDelete = new Action("Delete selected") {
public void run() {
int index = table.getSelectionIndex();
if (index < 0) {
System.out.println("Please select an item first. ");
return;
}
MessageBox messageBox = new MessageBox(shell, SWT.YES | SWT.NO);
messageBox.setText("Confirmation");
messageBox.setMessage("Are you sure to remove the bug with id #" + table.getItem(index).getText(0));
if (messageBox.open() == SWT.YES) {
table.remove(index);
}
}
};
Action actionSave = new Action("Save") {
public void run() {
saveBugs();
}
};
ToolBar toolBar = new ToolBar(shell, SWT.RIGHT | SWT.FLAT);
ToolBarManager manager = new ToolBarManager(toolBar);
manager.add(actionAddNew);
manager.add(actionDelete);
manager.add(new Separator());
manager.add(actionSave);
manager.update(true);
table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
table.setLayoutData(new GridData(GridData.FILL_BOTH));
table.setLinesVisible(true);
table.setHeaderVisible(true);
TableColumn tcID = new TableColumn(table, SWT.LEFT);
tcID.setText("ID");
TableColumn tcSummary = new TableColumn(table, SWT.NULL);
tcSummary.setText("Summary");
TableColumn tcAssignedTo = new TableColumn(table, SWT.NULL);
tcAssignedTo.setText("Assigned to");
TableColumn tcSolved = new TableColumn(table, SWT.NULL);
tcSolved.setText("Solved");
tcID.setWidth(60);
tcSummary.setWidth(200);
tcAssignedTo.setWidth(80);
tcSolved.setWidth(50);
table.pack();
final TableEditor editor = new TableEditor(table);
table.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event event) {
Point point = new Point(event.x, event.y);
final TableItem item = table.getItem(point);
if (item == null)
return;
int column = -1;
for (int i = 0; i < table.getColumnCount(); i++) {
Rectangle rect = item.getBounds(i);
if (rect.contains(point))
column = i;
}
if (column != 3)
return;
final Button button = new Button(table, SWT.CHECK);
button.setSelection(item.getText(column).equalsIgnoreCase("YES"));
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.setEditor(button, item, column);
final int selectedColumn = column;
Listener buttonListener = new Listener() {
public void handleEvent(final Event e) {
switch (e.type) {
case SWT.FocusOut :
item.setText(
selectedColumn,
button.getSelection() ? "YES" : "NO");
button.dispose();
break;
case SWT.Traverse :
switch (e.detail) {
case SWT.TRAVERSE_RETURN :
item.setText(
selectedColumn,
button.getSelection()
? "YES"
: "NO");
case SWT.TRAVERSE_ESCAPE :
button.dispose();
e.doit = false;
}
break;
}
}
};
button.addListener(SWT.FocusOut, buttonListener);
button.addListener(SWT.Traverse, buttonListener);
button.setFocus();
}
});
table.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event event) {
Point point = new Point(event.x, event.y);
final TableItem item = table.getItem(point);
if (item == null)
return;
int column = -1;
for (int i = 0; i < table.getColumnCount(); i++) {
Rectangle rect = item.getBounds(i);
if (rect.contains(point))
column = i;
}
if (column < 0 || column >= 3)
return;
final Text text = new Text(table, SWT.NONE);
text.setText(item.getText(column));
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.setEditor(text, item, column);
final int selectedColumn = column;
Listener textListener = new Listener() {
public void handleEvent(final Event e) {
switch (e.type) {
case SWT.FocusOut :
item.setText(selectedColumn, text.getText());
text.dispose();
break;
case SWT.Traverse :
switch (e.detail) {
case SWT.TRAVERSE_RETURN :
item.setText(
selectedColumn,
text.getText());
//FALL THROUGH
case SWT.TRAVERSE_ESCAPE :
text.dispose();
e.doit = false;
}
break;
}
}
};
text.addListener(SWT.FocusOut, textListener);
text.addListener(SWT.Traverse, textListener);
text.setFocus();
}
});
loadBugs();
table.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
System.out.println("Selected: " + table.getSelection()[0]);
}
});
Listener sortListener = new Listener() {
public void handleEvent(Event event) {
if(! (event.widget instanceof TableColumn))
return;
TableColumn tc = (TableColumn)event.widget;
sortTable(table, table.indexOf(tc));
System.out.println("The table is sorted by column #" + table.indexOf(tc));
}
};
for(int i=0; i
((TableColumn)table.getColumn(i)).addListener(SWT.Selection, sortListener);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
public static void sortTable(Table table, int columnIndex) {
if(table == null || table.getColumnCount() <= 1)
return;
if(columnIndex < 0 || columnIndex >= table.getColumnCount())
throw new IllegalArgumentException("The specified column does not exist. ");
final int colIndex = columnIndex;
Comparator comparator = new Comparator() {
public int compare(Object o1, Object o2) {
return ((TableItem)o1).getText(colIndex).compareTo(((TableItem)o2).getText(colIndex));
}
public boolean equals(Object obj) {
return false;
}
};
TableItem[] tableItems = table.getItems();
Arrays.sort(tableItems, comparator);
for(int i=0; i TableItem item = new TableItem(table, SWT.NULL); for(int j=0; j item.setText(j, tableItems[i].getText(j)); item.setImage(j, tableItems[i].getImage(j)); } tableItems[i].dispose(); } } private void saveBugs() { DataOutputStream out = null; try { File file = new File("bugs.dat"); out = new DataOutputStream(new FileOutputStream(file)); for (int i = 0; i < table.getItemCount(); i++) { TableItem item = table.getItem(i); out.writeUTF(item.getText(0)); out.writeUTF(item.getText(1)); out.writeUTF(item.getText(2)); out.writeBoolean(item.getText(3).equalsIgnoreCase("YES")); } } catch (IOException ioe) { } finally { try { if (out != null) out.close(); } catch (IOException e) { e.printStackTrace(); } } } private void loadBugs() { DataInputStream in = null; try { File file = new File("bugs.dat"); if (!file.exists()) return; in = new DataInputStream(new FileInputStream(file)); while (true) { String id = in.readUTF(); String summary = in.readUTF(); String assignedTo = in.readUTF(); boolean solved = in.readBoolean(); TableItem item = new TableItem(table, SWT.NULL); item.setImage(bugIcon); item.setText( new String[] { id, summary, assignedTo, solved ? "Yes" : "No" }); } } catch (IOException ioe) { } finally { try { if (in != null) in.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { new BugTracker(); } } 实现2: BugTrackerJFace.java 复制代码代码如下: package swt_jface.demo6; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Vector; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.Separator; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckboxCellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.viewers.ViewerSorter; 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.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.ToolBar; public class BugTrackerJFace { public static class Bug { public String id; public String summary; public String assignedTo; public boolean isSolved; public Bug(String id, String summary, String assignedTo, boolean isSolved) { this.id = id; this.summary = summary; this.assignedTo = assignedTo; this.isSolved = isSolved; } public static Vector loadBugs(File file) { Vector v = new Vector(); DataInputStream in = null; try { if (!file.exists()) return v; in = new DataInputStream(new FileInputStream(file)); while (true) { String id = in.readUTF(); String summary = in.readUTF(); String assignedTo = in.readUTF(); boolean solved = in.readBoolean(); v.add(new Bug(id, summary, assignedTo, solved)); } } catch (IOException ioe) { } finally { try { if (in != null) in.close(); } catch (IOException e) { e.printStackTrace(); } } return v; } } Display display = new Display(); Shell shell = new Shell(display); Table table; TableViewer tableViewer; Vector bugs; Image bugIcon = new Image(shell.getDisplay(), "C:/icons/bug.gif"); String[] colNames = new String[]{"ID", "Summary", "Assigned to", "Solved"}; class BugSorter extends ViewerSorter { private String property; private int propertyIndex; public BugSorter(String sortByProperty) { for(int i=0; i if(colNames[i].equals(sortByProperty)) { this.property = sortByProperty; this.propertyIndex = i; return; } } throw new IllegalArgumentException("Unrecognized property: " + sortByProperty); } public int compare(Viewer viewer, Object e1, Object e2) { Bug bug1 = (Bug)e1; Bug bug2 = (Bug)e2; switch(propertyIndex) { case 0: return bug1.id.compareTo(bug2.id); case 1: return bug1.summary.compareTo(bug2.summary); case 2: return bug1.assignedTo.compareTo(bug2.assignedTo); case 3: if(bug1.isSolved == bug2.isSolved) return 0; if(bug1.isSolved) return 1; else return -1; default: return 0; } } } public BugTrackerJFace() { Action actionAddNew = new Action("New bug") { public void run() { // Append. Bug bug = new Bug("", "", "", false); bugs.add(bug); tableViewer.refresh(false); } }; Action actionDelete = new Action("Delete selected") { public void run() { IStructuredSelection selection = (IStructuredSelection)tableViewer.getSelection(); Bug bug = (Bug)selection.getFirstElement(); if (bug == null) { System.out.println("Please select an item first. "); return; } MessageBox messageBox = new MessageBox(shell, SWT.YES | SWT.NO); messageBox.setText("Confirmation"); messageBox.setMessage( "Are you sure to remove the bug with id #" + bug.id); if (messageBox.open() == SWT.YES) { bugs.remove(bug); tableViewer.refresh(false); } } }; Action actionSave = new Action("Save") { public void run() { saveBugs(bugs); } }; final ViewerFilter filter = new ViewerFilter() { public boolean select( Viewer viewer, Object parentElement, Object element) { if(! ((Bug)element).isSolved) return true; return false; } }; Action actionShowUnsolvedOnly = new Action("Show unsolved only") { public void run() { if(! isChecked()) tableViewer.removeFilter(filter); else tableViewer.addFilter(filter); } }; actionShowUnsolvedOnly.setChecked(false); ToolBar toolBar = new ToolBar(shell, SWT.RIGHT | SWT.FLAT); ToolBarManager manager = new ToolBarManager(toolBar); manager.add(actionAddNew); manager.add(actionDelete); manager.add(new Separator()); manager.add(actionSave); manager.add(new Separator()); manager.add(actionShowUnsolvedOnly); manager.update(true); shell.setLayout(new GridLayout()); table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION); TableColumn tcID = new TableColumn(table, SWT.LEFT); tcID.setText(colNames[0]); TableColumn tcSummary = new TableColumn(table, SWT.NULL); tcSummary.setText(colNames[1]); TableColumn tcAssignedTo = new TableColumn(table, SWT.NULL); tcAssignedTo.setText(colNames[2]); TableColumn tcSolved = new TableColumn(table, SWT.NULL); tcSolved.setText(colNames[3]); tcID.setWidth(60); tcSummary.setWidth(200); tcAssignedTo.setWidth(80); tcSolved.setWidth(50); tableViewer = new TableViewer(table); tableViewer.getTable().setLinesVisible(true); tableViewer.getTable().setHeaderVisible(true); tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); tableViewer.setContentProvider(new IStructuredContentProvider() { public Object[] getElements(Object inputElement) { Vector v = (Vector)inputElement; return v.toArray(); } public void dispose() { System.out.println("Disposing ..."); } public void inputChanged( Viewer viewer, Object oldInput, Object newInput) { System.out.println("Input changed: old=" + oldInput + ", new=" + newInput); } }); tableViewer.setLabelProvider(new ITableLabelProvider() { public Image getColumnImage(Object element, int columnIndex) { if(columnIndex == 0) return bugIcon; return null; } public String getColumnText(Object element, int columnIndex) { Bug bug = (Bug)element; switch(columnIndex) { case 0: return bug.id; case 1: return bug.summary; case 2: return bug.assignedTo; case 3: return bug.isSolved ? "YES" : "NO"; } return null; } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } }); tableViewer.setColumnProperties(colNames); CellEditor[] cellEditors = new CellEditor[4]; cellEditors[0] = new TextCellEditor(table); cellEditors[1] = cellEditors[0]; cellEditors[2] = cellEditors[0]; cellEditors[3] = new CheckboxCellEditor(table); tableViewer.setCellEditors(cellEditors); tableViewer.setCellModifier(new ICellModifier() { public boolean canModify(Object element, String property) { return true; } public Object getValue(Object element, String property) { int index = -1; for(int i=0; i if(colNames[i].equals(property)) { index = i; break; } } Bug bug = (Bug)element; switch(index) { case 0: return bug.id; case 1: return bug.summary; case 2: return bug.assignedTo; case 3: return new Boolean(bug.isSolved); } return null; } public void modify(Object element, String property, Object value) { System.out.println("Modify: " + element + ", " + property + ", " + value); int index = -1; for(int i=0; i if(colNames[i].equals(property)) { index = i; break; } } Bug bug = null; if(element instanceof Item) { TableItem item = (TableItem)element; bug = (Bug)item.getData(); }else{ bug = (Bug)element; } switch(index) { case 0: bug.id = (String)value; break; case 1: bug.summary = (String)value; break; case 2: bug.assignedTo = (String)value; break; case 3: bug.isSolved = ((Boolean)value).booleanValue(); break; } tableViewer.update(bug, null); } }); tcID.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { tableViewer.setSorter(new BugSorter(colNames[0])); } }); tcSummary.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { tableViewer.setSorter(new BugSorter(colNames[1])); } }); tcAssignedTo.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { tableViewer.setSorter(new BugSorter(colNames[2])); } }); tcSolved.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { tableViewer.setSorter(new BugSorter(colNames[3])); } }); bugs = Bug.loadBugs(new File("bugs.dat")); tableViewer.setInput(bugs); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private void saveBugs(Vector v) { // Save bugs to a file. DataOutputStream out = null; try { File file = new File("bugs.dat"); out = new DataOutputStream(new FileOutputStream(file)); for (int i = 0; i < v.size(); i++) { Bug bug = (Bug)v.elementAt(i); out.writeUTF(bug.id); out.writeUTF(bug.summary); out.writeUTF(bug.assignedTo); out.writeBoolean(bug.isSolved); } } catch (IOException ioe) { } finally { try { if (out != null) out.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { new BugTrackerJFace(); } }