RCP開發淺談之SWT,JFACE

RCP開發淺談之SWT,JFACE

  • SWT
    什麼是SWT?
    SWT全名是Standard Widget Toolkit是一個開源的GUI編程框架,我們每一個java開發者,在學習java開發的時候都會接觸到awt以及swing這兩個圖形庫,與awt,swing兩個圖形庫不同,swt的優勢體現於底層調用本地的圖形庫,大大提高了運行速度(損失了一定跨平臺性)。SWT的一個很重要的一點,一個控件並不是單獨存在的,而是存在於父控件中。這樣當父控件disposed後,子控件也一定很disposed了。每一個swt控件的構造函數,都要依託於一個parent容器。
Table table = new Table(parent,SWT.MULTI|SWT.H_SCROLL);
  • JFACE
    既然有了SWT,爲什麼會有JFACE的誕生呢?當然是爲了彌不了對視圖層,控制層,數據層的隔離,進行了MVC的封裝。比如數據來源就是Model.通過
tableViewer.setInput(objs);

數據如何組織(Controller)

tableViewer.setContentProvider(new ArrayContentProvider)

數據如何顯示(Viewer)

tableViewer.setLabelProvider(..);

table展示數據依賴於索引,jface封裝了很多方法,你只需傳入一些對象就可玩成對數據的過濾,排序,組織等功能。

下面是一個具體table和tableviewer的demo:
依賴於5個包:

import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
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 com.google.common.collect.Lists;

class People {
    String name;
    String age;
    int index;

    public People(int index, String name, String age) {
        this.name = name;
        this.age = age;
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }

    public int getIndex() {
        return index;
    }

}

public class Demo {

    public static void main(String[] args) {
        Display display = Display.getDefault();
        Shell shell = new Shell(display);
        shell.setMaximized(true);
        shell.setLayout(new GridLayout(2, false));
        Table table = new Table(shell, SWT.MULTI | SWT.FULL_SELECTION
                | SWT.CHECK);
        table.setToolTipText("SWT table demo");
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        createColumLabel(table);
        List<People> objs = createData();
        for (int row = 0; row < objs.size(); row++) {
            TableItem item = new TableItem(table, SWT.FILL);
            // 依賴於具體參數
            for (int col = 0; col < table.getColumnCount(); col++) {
                if (objs.get(row) != null) {
                    switch (col) {
                    case 0:
                        item.setText(col, objs.get(row).getIndex() + "");
                        break;
                    case 1:
                        item.setText(col, objs.get(row).getName());
                        break;
                    case 2:
                        item.setText(col, objs.get(row).getAge());
                    }
                }
            }
        }
        table.pack();
        TableViewer tableViewer = new TableViewer(shell, SWT.CHECK
                | SWT.FULL_SELECTION);
        createColumLabel(tableViewer);
        tableViewer.setContentProvider(new ArrayContentProvider());
        tableViewer.setInput(objs);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                continue;
            }
        }
    }

    private static void createColumLabel(Table table) {
        for (int i = 0; i < 3; i++) {
            TableColumn tc = new TableColumn(table, SWT.CENTER);
            tc.setResizable(false);
            tc.setWidth(250);
        }
    }

    private static List<People> createData() {
        List<People> peoples = Lists.newArrayList();
        peoples.add(new People(1, "Li hua", "20"));
        peoples.add(new People(2, "Wang qiang", "30"));
        peoples.add(new People(3, "Zhang wei", "40"));
        return peoples;
    }

    private static void createColumLabel(TableViewer tableViewer) {
        TableViewerColumn viewerColum1 = new TableViewerColumn(tableViewer,
                SWT.NONE);
        viewerColum1.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof People) {
                    return People.class.cast(element).getIndex() + "";
                }
                return super.getText(element);
            }
        });
        TableViewerColumn viewerColum2 = new TableViewerColumn(tableViewer,
                SWT.NONE);
        viewerColum2.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof People) {
                    return People.class.cast(element).getName();
                }
                return super.getText(element);
            }
        });
        TableViewerColumn viewerColum3 = new TableViewerColumn(tableViewer,
                SWT.NONE);
        viewerColum3.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof People) {
                    return People.class.cast(element).getAge();
                }
                return super.getText(element);
            }
        });
        TableColumn tableColumn = viewerColum1.getColumn();
        tableColumn.setResizable(false);
        tableColumn.setWidth(250);
        tableColumn = viewerColum2.getColumn();
        tableColumn.setResizable(false);
        tableColumn.setWidth(250);
        tableColumn = viewerColum3.getColumn();
        tableColumn.setResizable(false);
        tableColumn.setWidth(250);

    }

}

第一篇RCP就寫到這裏。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章