專案現在基本上出了一個版本,雖然做的是邊緣工作,但是用到的東西還是整理一下吧,畢竟也算學了一點點東西。首先是TableView的使用。 RWT是SWT的子集,因此,RWT中可能沒有完全實現SWT的全部接口,也沒有SWT那麼完善。兩者的架構不同,表現在顯示形式,介面也不盡相同,但是基本的控制項的時候還是相同的。這裡首先透過SWT來學習一些常用控制項的使用。
首先說下SWT需要的函式庫檔。包括: org.eclipse.swt_3.xxjar org.eclipse.jface_3.xxjar
org.eclipse.core.runtime_3.xxjar org.eclipse.ui.workbench_3.xxjar (org.eclipse.equinox.common_3.xxjar)另外這個包中也包含org.eclipse.core.runtime 感覺組織的有點混亂,這個包也要導入。另外版本的不同也可能出現要包導入錯誤,注意下版本。
下面的程式碼就是Tableview的創建,是從《eclipse入門到精通》引用的
+ expand sourceview plaincopy to clipboardprint?
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
public class TableViewer1 {
public static void main(String[] args) {
new TableViewer1().open();
}
public void open() {
final Display display = new Display();
final Shell shell = new Shell();
shell.setSize(500, 150);
// ------------------------------------------
shell.setLayout(new FillLayout());
// 第一步:建立一個TableViewer物件。式樣:MULTI可多選、H_SCROLL有水平捲軸、V_SCROLL有垂直捲軸、BORDER有邊框、FULL_SELECTION整行選擇
TableViewer tv = new TableViewer(shell, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
// 第二步:透過表格內含的Table物件設定佈局方式
Table table = tv.getTable();
table.setHeaderVisible(true); // 顯示表頭
table.setLinesVisible(true); // 顯示表格線
TableLayout layout = new TableLayout(); // 專用於表格的佈局
table.setLayout(layout);
// 步驟三:用TableColumn類別建立表格列
layout.addColumnData(new ColumnWeightData(13));// ID列寬13像素
new TableColumn(table, SWT.NONE).setText("ID號碼");
layout.addColumnData(new ColumnWeightData(40));
new TableColumn(table, SWT.NONE).setText("姓名");
layout.addColumnData(new ColumnWeightData(20));
new TableColumn(table, SWT.NONE).setText("性別");
layout.addColumnData(new ColumnWeightData(20));
new TableColumn(table, SWT.NONE).setText("年齡");
layout.addColumnData(new ColumnWeightData(60));
new TableColumn(table, SWT.NONE).setText("記錄建立時間");
// 第四步:設定內容器和標籤器
tv.setContentProvider(new TableViewerContentProvider());
tv.setLabelProvider(new TableViewerLabelProvider());
// 第五步:用TableViewer的setInput方法將資料輸入到表格
Object data = PeopleFactory.getPeoples();
tv.setInput(data);
// ------------------------------------------
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
public class TableViewer1 {
public static void main(String[] args) {
new TableViewer1().open();
}
public void open() {
final Display display = new Display();
final Shell shell = new Shell();
shell.setSize(500, 150);
// ------------------------------------------
shell.setLayout(new FillLayout());
// 第一步:建立一個TableViewer物件。式樣:MULTI可多選、H_SCROLL有水平捲軸、V_SCROLL有垂直捲軸、BORDER有邊框、FULL_SELECTION整行選擇
TableViewer tv = new TableViewer(shell, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
// 第二步:透過表格內含的Table物件設定佈局方式
Table table = tv.getTable();
table.setHeaderVisible(true); // 顯示表頭
table.setLinesVisible(true); // 顯示表格線
TableLayout layout = new TableLayout(); // 專用於表格的佈局
table.setLayout(layout);
// 步驟三:用TableColumn類別建立表格列
layout.addColumnData(new ColumnWeightData(13));// ID列寬13像素
new TableColumn(table, SWT.NONE).setText("ID號碼");
layout.addColumnData(new ColumnWeightData(40));
new TableColumn(table, SWT.NONE).setText("姓名");
layout.addColumnData(new ColumnWeightData(20));
new TableColumn(table, SWT.NONE).setText("性別");
layout.addColumnData(new ColumnWeightData(20));
new TableColumn(table, SWT.NONE).setText("年齡");
layout.addColumnData(new ColumnWeightData(60));
new TableColumn(table, SWT.NONE).setText("記錄建立時間");
// 第四步:設定內容器和標籤器
tv.setContentProvider(new TableViewerContentProvider());
tv.setLabelProvider(new TableViewerLabelProvider());
// 第五步:用TableViewer的setInput方法將資料輸入到表格
Object data = PeopleFactory.getPeoples();
tv.setInput(data);
// ------------------------------------------
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
下面分別是那2個提供類,這2個在類如果代碼較少,服務與1個表時候可以寫成內部類:
view plaincopy to clipboardprint?
import java.util.List;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
//內容器。由此類對輸入到表格的資料進行篩選和轉換。
//這類要實作介面的三種方法, 其中getElements是主要方法,另外兩個方法很少用到,空實作就行了
public class TableViewerContentProvider implements IStructuredContentProvider {
// 將輸入到表格的資料集進行篩選和轉。
// 輸入的資料集全部要轉換成數組,每一個數組元素就是一個實體類別對象,也就是表格中的一筆記錄。
public Object[] getElements(Object element) {
// 參數element就是透過setInput(Object input)輸入的物件input,本例輸入給setInput是List集合
if (element instanceof List)// 加一個List類型判斷
return ((List) element).toArray(); // 將資料集List轉換為數組
else
return new Object[0]; // 如非List型別則傳回空數組
}
// 當TableViewer物件關閉時觸發執行此方法
public void dispose() {
}
// 當TableViewer再次呼叫setInput()時觸發執行此方法
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
}
import java.util.List;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
//內容器。由此類對輸入到表格的資料進行篩選和轉換。
//這類要實作介面的三種方法, 其中getElements是主要方法,另外兩個方法很少用到,空實作就行了
public class TableViewerContentProvider implements IStructuredContentProvider {
// 將輸入到表格的資料集進行篩選和轉。
// 輸入的資料集全部要轉換成數組,每一個數組元素就是一個實體類別對象,也就是表格中的一筆記錄。
public Object[] getElements(Object element) {
// 參數element就是透過setInput(Object input)輸入的物件input,本例輸入給setInput是List集合
if (element instanceof List)// 加一個List類型判斷
return ((List) element).toArray(); // 將資料集List轉換為數組
else
return new Object[0]; // 如非List型別則傳回空數組
}
// 當TableViewer物件關閉時觸發執行此方法
public void dispose() {
}
// 當TableViewer再次呼叫setInput()時觸發執行此方法
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
}
view plaincopy to clipboardprint?
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;
//標籤器。如果說內容器是對輸入表格的資料集作處理,
//那麼標籤器則是對資料集中的單一實體物件進行處理和轉化,由標籤器決定實體物件中的欄位顯示在表格的哪一列中。
public class TableViewerLabelProvider implements ITableLabelProvider {
// 建立幾個圖像
private Image[] images = new Image[] {
new Image(null, "icons/refresh.gif"),
new Image(null, "icons/star.jpg"),
new Image(null, "icons/moon.jpg") };
// 由此方法決定資料記錄在表格的每一列顯示什麼文字。
// element參數是一個實體類別物件。 col是目前要設定的列的列號,0是第一列。
public String getColumnText(Object element, int col) {
PeopleEntity o = (PeopleEntity) element; // 型別轉換
if (col == 0)// 第一列要顯示什麼數據
return o.getId().toString();
if (col == 1)
return o.getName();
if (col == 2)
return o.isSex() ? "男" : "女";
if (col == 3)
return String.valueOf(o.getAge()); // 將int型別轉為String型
if (col == 4)
return o.getCreateDate().toString();
return null; // 方法可以傳回空值
}
// getColumnText方法用於顯示文字,此方法用於顯示圖片。
public Image getColumnImage(Object element, int col) {
PeopleEntity o = (PeopleEntity) element;
// 只讓「陳剛」這筆記錄顯示圖片
if (o.getName().equals("陳剛") || o.getName().equals("週閱")) {
if (col == 0)// 第一列要顯示的圖片
return images[0];
if (col == 2)// 依性別顯示不同的圖標
return o.isSex() ? images[1] : images[2];
}
return null; // 方法可以傳回空值
}
public void dispose() {
// 別忘了SWT元件的原則:自己創建,自釋放
for (Image image : images) {
image.dispose();
}
}
// -------------以下方法很少使用,先不用管,讓它們空實現-----------------
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void addListener(ILabelProviderListener listener) {
}
public void removeListener(ILabelProviderListener listener) {
}
}
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;
//標籤器。如果說內容器是對輸入表格的資料集作處理,
//那麼標籤器則是對資料集中的單一實體物件進行處理和轉化,由標籤器決定實體物件中的欄位顯示在表格的哪一列中。
public class TableViewerLabelProvider implements ITableLabelProvider {
// 建立幾個圖像
private Image[] images = new Image[] {
new Image(null, "icons/refresh.gif"),
new Image(null, "icons/star.jpg"),
new Image(null, "icons/moon.jpg") };
// 由此方法決定資料記錄在表格的每一列顯示什麼文字。
// element參數是一個實體類別物件。 col是目前要設定的列的列號,0是第一列。
public String getColumnText(Object element, int col) {
PeopleEntity o = (PeopleEntity) element; // 型別轉換
if (col == 0)// 第一列要顯示什麼數據
return o.getId().toString();
if (col == 1)
return o.getName();
if (col == 2)
return o.isSex() ? "男" : "女";
if (col == 3)
return String.valueOf(o.getAge()); // 將int型別轉為String型
if (col == 4)
return o.getCreateDate().toString();
return null; // 方法可以傳回空值
}
// getColumnText方法用於顯示文字,此方法用於顯示圖片。
public Image getColumnImage(Object element, int col) {
PeopleEntity o = (PeopleEntity) element;
// 只讓「陳剛」這筆記錄顯示圖片
if (o.getName().equals("陳剛") || o.getName().equals("週閱")) {
if (col == 0)// 第一列要顯示的圖片
return images[0];
if (col == 2)// 依性別顯示不同的圖標
return o.isSex() ? images[1] : images[2];
}
return null; // 方法可以傳回空值
}
public void dispose() {
// 別忘了SWT元件的原則:自己創建,自釋放
for (Image image : images) {
image.dispose();
}
}
// -------------以下方法很少使用,先不用管,讓它們空實現-----------------
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void addListener(ILabelProviderListener listener) {
}
public void removeListener(ILabelProviderListener listener) {
}
}
另外就是實體類,這裡只是簡單的寫了一個實體,這裡的資料可以從資料庫中讀取,但是那樣注意資料的儲存使用的容器類型,
並注意類型的轉換。
view plaincopy to clipboardprint?
import java.util.Date;
//本類別包含五個不同資料類型的變量,分別對應資料庫表中的五個欄位。變數為private型,即只能
//由類別的內部程式碼訪問,外界只能透過這些變數對應的Setter/Geter方法來存取它們
public class PeopleEntity {
private Long id; //惟一識別碼,在資料庫裡常為自動遞增的ID列
private String name; //姓名
private boolean sex; //性別true男,flase女
private int age; //年齡
private Date createDate; //記錄的建立日期。 Date類型是java.util.Date,而不是java.sql.Date
//以下程式碼為字段各自的Setter/Geter方法。參考第3.5.2節,這些方法在Eclipse可自動產生。
public Long getId() { return id;}
public void setId(Long long1) {id = long1;}
public String getName() {return name;}
public void setName(String string) {name = string;}
public boolean isSex() { return sex;}
public void setSex(boolean sex) { this.sex = sex; }
public int getAge() {return age;}
public void setAge(int i) {age = i;}
public Date getCreateDate() {return createDate;}
public void setCreateDate(Date date) {createDate = date;}
}
import java.util.Date;
//本類別包含五個不同資料類型的變量,分別對應資料庫表中的五個欄位。變數為private型,即只能
//由類別的內部程式碼訪問,外界只能透過這些變數對應的Setter/Geter方法來存取它們
public class PeopleEntity {
private Long id; //惟一識別碼,在資料庫裡常為自動遞增的ID列
private String name; //姓名
private boolean sex; //性別true男,flase女
private int age; //年齡
private Date createDate; //記錄的建立日期。 Date類型是java.util.Date,而不是java.sql.Date
//以下程式碼為字段各自的Setter/Geter方法。參考第3.5.2節,這些方法在Eclipse可自動產生。
public Long getId() { return id;}
public void setId(Long long1) {id = long1;}
public String getName() {return name;}
public void setName(String string) {name = string;}
public boolean isSex() { return sex;}
public void setSex(boolean sex) { this.sex = sex; }
public int getAge() {return age;}
public void setAge(int i) {age = i;}
public Date getCreateDate() {return createDate;}
public void setCreateDate(Date date) {createDate = date;}
}
另外是封裝的取得資料的介面:
view plaincopy to clipboardprint?
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
//建立PeopleEntity物件的工廠,建立三個PeopleEntry對象,並裝入List集合返回
public class PeopleFactory {
public static List<PeopleEntity> getPeoples() { // 工廠的靜態方法
List<PeopleEntity> list = new ArrayList<PeopleEntity>();
{ // 第1個實體類別對象
PeopleEntity o = new PeopleEntity();
o.setId(new Long(1));// id欄位的型別被定義成了Long,所以要轉換一下
o.setName("陳剛");
o.setSex(true);
o.setAge(28);
o.setCreateDate(new Date()); // 目前日期
list.add(o);
}
{ // 第2個實體類別對象
PeopleEntity o = new PeopleEntity();
o.setId(2L); // 利用JDK5.0的自動裝箱功能,省了long到Long物件的轉化
o.setName("週閱");
o.setSex(false);
o.setAge(18);
o.setCreateDate(new Date());
list.add(o);
}
{ // 第3個實體類別對象
PeopleEntity o = new PeopleEntity();
o.setId(3L);
o.setName("陳常恩");
o.setSex(true);
o.setAge(27);
o.setCreateDate(new Date());
list.add(o);
}
return list;
}
}
本文來自CSDN博客,轉載請標示: http://blog.csdn.net/youxigogo/archive/2009/12/30/5105179.aspx
-