天天看點

【Eclipse插件開發】TableViewer的簡單實作

  最近在開發關于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方法運作第一個主類可以看到如下效果,圖示可以自己切換,也可以為空:

【Eclipse插件開發】TableViewer的簡單實作

希望這篇教程能夠對你有所幫助。

繼續閱讀