最近在開發關于eclipse插件的相關,中途遇到很多坑,下面這個例子是目前我找到的比較簡潔的關于tableViewer的例子,記錄下來,分享給廣大網友,本來想說明出處,但是由于網上的很多原創其實并非原創,我也就實行“拿來主義”分享給大家了。
一、建立表格分為三個步驟,大概講一下。(後面有完成的代碼,可以直接複制黏貼使用)
1、第一步:定義一個TableViewer對象.
//首先定義一個表格(TableViewer類)對象
private TableViewer tableviewer;
/*
* 同時在構造方法中定義其式樣. 這裡設定成可以多選(SWT.MULTI),
* 有水準滾動條(SWT.H_SCROLL),有垂直滾動條(SWT.V_SCROLL),
* 有邊框(SWT.BORDER),可以整行選擇(SWT.FULL_SELECTION)
*/
tableviewer = new TableViewer(prarent, SWT.MULTI | SWT.H_SCROLL | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.FULL_SELECTION );
2、第二步:通過TableViewer中的Table對其布局.
Table table = tableviewer.getTable();
//設定表頭
table.setHeaderVisible(true);
//顯示表格線
table.setLinesVisible(true);
//專用于表格的布局
TableLayout tLayout = new TableLayout();
table.setLayout(tLayout);
3、第三步:建立TableViewer中的列
tLayout.addColumnData(new ColumnWeightData(20));//這個是設定ID列的列寬為10像素
new TableColumn(table, SWT.NONE).setText("ID号");
tLayout.addColumnData(new ColumnWeightData(20));//這個是設定ID列的列寬為40像素
new TableColumn(table, SWT.NONE).setText("姓名");
tLayout.addColumnData(new ColumnWeightData(20));//這個是設定ID列的列寬為10像素
new TableColumn(table, SWT.NONE).setText("性别");
tLayout.addColumnData(new ColumnWeightData(20));//這個是設定ID列的列寬為10像素
new TableColumn(table, SWT.NONE).setText("年齡");
tLayout.addColumnData(new ColumnWeightData(70));//這個是設定ID列的列寬為70像素
new TableColumn(table, SWT.NONE).setText("記錄建立時間");
二、上面就是一個表格的主體内容和實作的步驟了,下面開始貼代碼:
1、TableViewer 表格主體類
//TableViewer 表格主體類
package testTableViewer;
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.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
/**
* TableViewer類的實作類
* @author John
*/
public class TableViewer {
//首先定義一個表格(TableViewer類)對象
private TableViewer tableviewer;
public static void main(String[] args) {
TableViewer window = new TableViewer();
window.open();
}
//定義這個open()方法.就是建立一個典型的SWT程式的步驟
public void open(){
//1.display負責管理一實作循環和控制UI線程和其他線程之間的通信
Display display = new Display();
//2.建立一個或者多個Shell(shell是程式的主視窗)
Shell shell = new Shell();
//3.設定shell的布局.
shell.setSize(500, 150);
//設定shell的布局為FillLayout
shell.setLayout(new FillLayout());
shell.setText("TableViewer的第一個例子");
//調用自定義的方法建立表格
createTableViewer(shell);
//4.設定内容器
tableviewer.setContentProvider(new TableViewerContentProvider());
//5.設定标簽器
tableviewer.setLabelProvider(new TableViewerLabelProvider());
//6.用setInput輸入資料(把PeopleFactory産生的List集合傳進來)
tableviewer.setInput(PeopleFactory.getPeoples());
//7.建立Shell中的元件(這個例子中沒有加入元件,隻有一個空視窗)
shell.open();
//8.寫一個時間轉發循環
while(!shell.isDisposed()){//如果主視窗沒有關閉,則一直循環
//dispose 是"處理,處置,毀掉"的意思
if(!display.readAndDispatch()){ 如果display不忙
display.sleep();// display休眠
}
}
}
/**
* 建立一個表格
*/
public void createTableViewer(Composite prarent){
/**
* 第一步:定義一個TableViewer對象.
* 同時在構造方法中定義其式樣. 這裡設定成可以多選(SWT.MULTI),
* 有水準滾動條(SWT.H_SCROLL),有垂直滾動條(SWT.V_SCROLL),
* 有邊框(SWT.BORDER),可以整行選擇(SWT.FULL_SELECTION)
*/
tableviewer = new TableViewer(prarent, SWT.MULTI | SWT.H_SCROLL | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.FULL_SELECTION );
/**
* 第二步:通過TableViewer中的Table對其布局.
*/
Table table = tableviewer.getTable();
table.setHeaderVisible(true);//設定标頭
table.setLinesVisible(true);//顯示表格線
TableLayout tLayout = new TableLayout();//專用于表格的布局
table.setLayout(tLayout);
/**
* 第三步:建立TableViewer中的列
*/
tLayout.addColumnData(new ColumnWeightData(20));//這個是設定ID列的列寬為10像素
new TableColumn(table, SWT.NONE).setText("ID号");
tLayout.addColumnData(new ColumnWeightData(20));//這個是設定ID列的列寬為40像素
new TableColumn(table, SWT.NONE).setText("姓名");
tLayout.addColumnData(new ColumnWeightData(20));//這個是設定ID列的列寬為10像素
new TableColumn(table, SWT.NONE).setText("性别");
tLayout.addColumnData(new ColumnWeightData(20));//這個是設定ID列的列寬為10像素
new TableColumn(table, SWT.NONE).setText("年齡");
tLayout.addColumnData(new ColumnWeightData(70));//這個是設定ID列的列寬為70像素
new TableColumn(table, SWT.NONE).setText("記錄建立時間");
}
}
2、tableViewer的标簽器TableViewerLabelProvider
package testTableViewer;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;
//-------------檔案名:TableViewerLabelProvider.java-------------------
//标簽器。如果說内容器是對輸入表格的資料集作處理,那麼标簽器則是對資料集中的單個實體對象
//進行處理和轉化,由标簽器來決定實體對象中的字段顯示在表格的哪一列中
public class TableViewerLabelProvider implements ITableLabelProvider {
// 建立幾個圖像
private Image[] images = new Image[] { new Image(null, "icons/1.PNG"), new Image(null, "icons/1.PNG"),
new Image(null, "icons/1.PNG") };
// 由此方法決定資料記錄在表格的每一列顯示什麼文字。 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; // 方法可以傳回空值
}
// 當TableViewer對象被關閉時觸發執行此方法
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) {
}
}
3、tableViewer的内容器TableViewerContentProvider
package testTableViewer;
import java.util.List;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
/**
* 建立這個類,主要是對List集合中的資料記錄進行篩選和轉化. 是"内容器"的作用.
* 内容器中主要是對setInput()輸入的資料集集合(本例子中指的是在PeopleFactory中封裝好的List集合)做處理.
* 并且轉換化成一個數組傳回.
*
* 實作對應的接口IStructuredContentProvider,然後實作其中的方法.
*
* @author John
*/
public class TableViewerContentProvider implements IStructuredContentProvider {
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
// 實作IStructuredContentProvider接口之後,主要複寫的就是這個getElements()方法.
@Override
public Object[] getElements(Object inputElement) {// setInput傳過來的是一個集合
if (inputElement instanceof List) {// 對這個參數進行類型的判斷.
return ((List) inputElement).toArray();// 将setInput傳過來的List變成一個數組輸出
} else {
return new Object[0];
}
}
}
至此,完畢。main方法運作第一個主類可以看到如下效果,圖示可以自己切換,也可以為空:
希望這篇教程能夠對你有所幫助。