Swt/Jface tableViewer入門教程(顯示tableViewer) 轉 受益匪淺

Swt/Jface tableViewer入門教程(顯示tableViewer)
1,簡單顯示,表格的式樣見註釋中的內容
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
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 TestTableViewer {
    private static Table table;
    /** *//**
     * Launch the application
     * @param args
     */
    public static void main(String[] args) {
        final Display display = Display.getDefault();
        final Shell shell = new Shell();
        shell.setSize(500, 375);
        shell.setText("SWT Application");
        //注意這裏,SWT.NULTI代表可以選擇多行,SWT.FULL_SELECTION代表可以整行選擇,SWT.BORDER邊框,SWT.V_SCROLL ,SWT.H_SCROLL滾動條
        final TableViewer tableViewer = new TableViewer(shell, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL);
       
        table = tableViewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        table.setBounds(97, 79, 373, 154);

        final TableColumn newColumnTableColumn = new TableColumn(table, SWT.NONE);
        newColumnTableColumn.setWidth(39);
        newColumnTableColumn.setText("ID");

        final TableColumn newColumnTableColumn_1 = new TableColumn(table, SWT.NONE);
        newColumnTableColumn_1.setWidth(85);
        newColumnTableColumn_1.setText("姓名");
       
        final TableColumn newColumnTableColumn_2 = new TableColumn(table, SWT.NONE);
        newColumnTableColumn_2.setWidth(41);
        newColumnTableColumn_2.setText("性別");

        final TableColumn newColumnTableColumn_3 = new TableColumn(table, SWT.NONE);
        newColumnTableColumn_3.setWidth(43);
        newColumnTableColumn_3.setText("年齡");

        final TableColumn newColumnTableColumn_4 = new TableColumn(table, SWT.NONE);
        newColumnTableColumn_4.setWidth(126);
        newColumnTableColumn_4.setText("創建日期");
       
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
    }
}2,加入佈局
顯示的效果不好,我們要加入佈局,讓view填充整個畫面在shell.open()後加上
ok,效果達到
3,爲TableViewer加上數據,光突突的樣子不好看。這裏是demo所以不再從數據庫裏邊取數據了。自己構造一個List用來做數據。實際使用中也是這麼使用,不過不同的是這裏是隨意構造的list,而顯示實際使用中是從數據庫取出數據構造list.
(1)構造一個people類,同時給People類提供一個構造假數據的方法getPeople()
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class People{
    private Long id;
    private String name;
    private String sex;
    private Integer age;
    private Date createDate;
    public People(Long id,String name,String sex,Integer age,Date createDate){
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.createDate = createDate;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public static List getPeople(){
        List list = new ArrayList();
        int n = 30;
        for(int i=1;i<n;i++){
            Long id = new Long(i);
            String name = "張"+i;
            String sex = "男";
            if((i%2) == 0){
                sex = "女";
            }
            Integer age;
            if(i<10){
                age = new Integer(i*10);
            }else if(i>10 && i<100){
                age = new Integer(i);
            }else if(i>100 && i<1000){
                age = new Integer(i/10);
            }else{
                age = new Integer(22);
            }
            Date createDate = new Date();
            People people = new People(id,name,sex,age,createDate);
            list.add(people);
        }
        return list;
    }
}
(2)給tableViewer提供內容器(IStructuredContentPorvider)和標籤器(ITableLabelProvider)
如果想一個tableviewer顯示數據,那必須給它提供內容器和標籤器,內容器的作用是從List(也可以是其他的集合類)中提取出一個對象(例如People對應着表格的一行,數據庫的一條記錄),標籤器的作用是從一個對象中提取出一個字段(例如年齡,對應着表格中的一個單元格,數據庫中某一列的一個值)下邊是內容器和標籤器的代碼:
內容器:
import java.util.List;

import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;

public class ContentProvider implements IStructuredContentProvider {
        public Object[] getElements(Object inputElement) {
            if(inputElement instanceof List){
                return ((List)inputElement).toArray();
            }else{
                return new Object[0];
            }
        }
        public void dispose() {
        }
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }標籤器:
import java.text.SimpleDateFormat;

import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;

public class TableLabelProvider extends LabelProvider implements ITableLabelProvider {
        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof People){
                People p = (People)element;
                if(columnIndex == 0){
                    return p.getId().toString();
                }else if(columnIndex == 1){
                    return p.getName();
                }else if (columnIndex ==2){
                    return p.getSex();
                }else if (columnIndex == 3){
                    return p.getAge().toString();
                }else if (columnIndex == 4){
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    return sdf.format(p.getCreateDate());
                }
            }
            return null;
        }
        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }
    }
注意這裏:extends LabelProvider,爲什麼要加這個呢? 因爲如果不加這個,因爲實現 ITableLabelProvider 的緣故我們還要寫四個空函數,而我們本身不需要在這四個空函數中實現什麼,所以讓它繼承自LabelProvider,就可以避免四個空函數。
(3)把標籤器和內容器給tableviewer
在shell.open()前邊加上這幾行


//設置內容器
tableViewer.setContentProvider(new ContentProvider());
//設置標籤器
tableViewer.setLabelProvider(new TableLabelProvider());
//把數據集合給tableView
tableViewer.setInput(People.getPeople());
//這樣利用內容器和標籤器就能從setInput得到的數據集合分解出顯示錶格需要的數據。這是一個典型的mvc的實現.
4,樣式改變
如果想在每一列前加入一個checkbox
只需要在開始的式樣中加入SWT.CHECK

好了到此一個簡單的樣子選擇出來了,但這僅僅是開始,下邊將繼續介紹按列排序、過濾器、行的顏色設置、在表格上直接編輯等功能

發佈了10 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章