DANCE WITH JAVA

          開發出高質量的系統

          常用鏈接

          統計

          積分與排名

          好友之家

          最新評論

          Eclipse Rcp系列三 進一步了解Viewer

          好在二的基礎上,繼續,這個時候我們須要增加一個Viewer.在這里我須要說一下,在eclipse的開發中用到的很多
          的是Viewer(視圖)這個概念,而不像Vb等開發中經常用到的window(窗口),并不是說Rcp中沒有窗口,而是使用
          頻率較低,所以分別說一下如何添加窗口和Viewer

          一,添加一個對話框窗口:添加一個類如下,然後在須要顯視的地方調用一下open()方法
          不一定非要繼承自Dialog,這里為了漸少一些代碼,而且我使用中也多繼承自Dialog
          package hellorcp;

          import org.eclipse.swt.SWT;
          import org.eclipse.swt.widgets.Dialog;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Shell;

          public class HelloDialog extends Dialog {

           protected Object result;

           protected Shell shell;

           public HelloDialog(Shell parent, int style) {
            super(parent, style);
           }

           public HelloDialog(Shell parent) {
            this(parent, SWT.NONE);
           }
           public Object open() {
            createContents();
            shell.open();
            shell.layout();
            Display display = getParent().getDisplay();
            while (!shell.isDisposed()) {
             if (!display.readAndDispatch())
              display.sleep();
            }
            return result;
           }

           protected void createContents() {
            shell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
            shell.setSize(500, 375);
            shell.setText("SWT Dialog");
            //
           }

          }

          二,添加一個viewer,首先建立一個viewer,下邊是Designer(一個很好用的插件)自動生成的一個viewer,
          也就是一個Viewer的大概結構
          package hellorcp;

          import org.eclipse.jface.action.IMenuManager;
          import org.eclipse.jface.action.IToolBarManager;
          import org.eclipse.swt.SWT;
          import org.eclipse.swt.widgets.Composite;
          import org.eclipse.ui.part.ViewPart;

          public class HelloView extends ViewPart {

           public static final String ID = "hellorcp.HelloView"; //$NON-NLS-1$

           public void createPartControl(Composite parent) {
            Composite container = new Composite(parent, SWT.NONE);
            //
            createActions();
            initializeToolBar();
            initializeMenu();
           }

           private void createActions() {
            // Create the actions
           }
           private void initializeToolBar() {
            IToolBarManager toolbarManager = getViewSite().getActionBars()
              .getToolBarManager();
           }

           private void initializeMenu() {
            IMenuManager menuManager = getViewSite().getActionBars()
              .getMenuManager();
           }

           public void setFocus() {
            // Set the focus
           }

          }
          顯視這個viewer,每個viewer須要加載到perspective上才能顯視,所以在Perspective.java中加入如下代碼
          public void createInitialLayout(IPageLayout layout) {
           layout.setEditorAreaVisible(false);//不顯視edit窗口
           String editorArea = layout.getEditorArea();
           //下邊兩句的不同是,一個顯視的是單頁窗口,一個顯視的是多頁窗口
           layout.addStandaloneView(HelloViewer.ID,false, IPageLayout.LEFT, 0.25f, editorArea);
           layout.addView(HelloViewer.ID, IPageLayout.RIGHT, 0.75f, editorArea);

          三,在viewer或者dialog上添加控件,如果裝有Designer可以直接拖放,如果沒有編程實現也可以
          大部份添加到下邊這樣的函數中
          viewer:
          public void createPartControl(Composite parent) {
            Composite container = new Composite(parent, SWT.NONE);
            //添加一個button
            final Button delBtn = new Button(container, SWT.NONE);
            delBtn.setText("刪除");
            delBtn.setBounds(10, 83, 44, 22);
            addListener2DelBtn(delBtn);
            
            createActions();
            initializeToolBar();
            initializeMenu();
          }
          dialog:
          protected void createContents() {
            shell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
            shell.setSize(500, 375);
            shell.setText("SWT Dialog");

          四,響應事件,SWT的事件響應和Swing是一樣的,添加listener
          delBtn.addSelectionListener(new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
              //加入你響應事件要做的事情
             }
          });

          五,布局
          布局方面swt沒有什么新的地方,發個簡單使用布局的例子,參考吧.另外布局還有很多搭配,但不是本文的
          重點,暫時帶過
          import org.eclipse.swt.SWT;
          import org.eclipse.swt.events.SelectionEvent;
          import org.eclipse.swt.events.SelectionListener;
          import org.eclipse.swt.graphics.Font;
          import org.eclipse.swt.graphics.Point;
          import org.eclipse.swt.graphics.Rectangle;
          import org.eclipse.swt.layout.FormAttachment;
          import org.eclipse.swt.layout.FormData;
          import org.eclipse.swt.layout.FormLayout;
          import org.eclipse.swt.widgets.Button;
          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;

          public class TableDemo {

            /**
            * @param args
            */
            public static void main(String[] args) {
              Display   dispMain = new Display ();
             
              final Shell shellMain = new Shell (dispMain, SWT.TITLE | SWT.MIN | SWT.BORDER);
                 
              shellMain.setText("Table Demo");
             
              FormLayout formLayout = new FormLayout();
              formLayout.marginLeft = 10;
              formLayout.marginRight = 10;
              formLayout.marginTop = 10;
              formLayout.marginBottom = 10;
              formLayout.spacing = 10;
              shellMain.setLayout(formLayout);

              shellMain.setSize(800, 600);
              Point size = shellMain.getSize();
              Rectangle rect = dispMain.getBounds();
              shellMain.setLocation(rect.x + (rect.width-size.x)/2, rect.y + (rect.height-size.y)/2);

              Table demoTable = (Table)createContents(shellMain);    
              FormData formData = new FormData();
              formData.left = new FormAttachment(0, 0);
              formData.top = new FormAttachment(0, 0);
              formData.right = new FormAttachment(100, 0);
              formData.bottom = new FormAttachment(100, -34);
              demoTable.setLayoutData(formData);

              Button btnClose = new Button(shellMain, SWT.PUSH | SWT.FLAT);
              btnClose.setText("close");
             
              formData = new FormData();
              formData.right = new FormAttachment(100, 0);
              formData.top = new FormAttachment(demoTable, 0);
              formData.width = 100;
              formData.bottom = new FormAttachment(100, 0);
              btnClose.setLayoutData(formData);
             
              btnClose.addSelectionListener(
                  new SelectionListener() {
                    public void widgetDefaultSelected(SelectionEvent e) {
                      this.widgetSelected(e);
                    }
                   
                    public void widgetSelected(SelectionEvent e) {
                      shellMain.close();
                    }
                  }
              );
              shellMain.open ();
             
              while (!shellMain.isDisposed ()) {
                  if (!dispMain.readAndDispatch ()) {
                    dispMain.sleep ();
                  }
              }
              dispMain.dispose ();
              dispMain = null;
            }

            /**
            *
            * @param shellMain
            * @return
            */
            private static Table createContents(Shell shellMain) {
              Table table = new Table(shellMain, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
              table.setHeaderVisible(true);
              table.setLinesVisible(true);
              table.setFont(new Font(shellMain.getDisplay(), "Arial", 11, SWT.BOLD));
             
              TableColumn colNumber = new TableColumn(table, SWT.NONE);
              TableColumn colMedName = new TableColumn(table, SWT.CENTER);
              TableColumn colPrice = new TableColumn(table, SWT.CENTER);
              TableColumn colUnit = new TableColumn(table, SWT.CENTER);
              TableColumn colCount = new TableColumn(table, SWT.CENTER);
             
              colNumber.setWidth(25);
             
              colMedName.setWidth(150);
              colMedName.setText("Medicine Name");
             
              colPrice.setWidth(150);
              colPrice.setText("Medicine Price");
             
              colUnit.setWidth(150);
              colUnit.setText("Medicine Unit");
             
              colCount.setWidth(150);
              colCount.setText("Medicine Count");
             
              for(int i=0; i<10; i++) {
                  TableItem item = new TableItem(table, SWT.NONE);
                  item.setText(new String[]{i+1+"","4/2","4/3","4/4","4/5","4/6","4/7","4/8","4/9"});
              }
              return table;
            }
          }
          五,加入 右鍵 ,雙擊
          加入兩個listener
          //右鍵
          private void hookContextMenu() {
            MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
            menuMgr.setRemoveAllWhenShown(true);
            menuMgr.addMenuListener(new IMenuListener() {
             public void menuAboutToShow(IMenuManager manager) {
              HelloView.this.fillContextMenu(manager);
             }
            });
            Menu menu = menuMgr.createContextMenu(viewer.getControl());
            viewer.getControl().setMenu(menu);
            getSite().registerContextMenu(menuMgr, viewer);
          }
          private void fillContextMenu(IMenuManager manager) {
            manager.add(addAction);
            manager.add(modifyAction);
            manager.add(deleteAction);
            manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
          }
          //雙擊
          private void hookDoubleClickAction() {
            viewer.addDoubleClickListener(new IDoubleClickListener() {
             public void doubleClick(DoubleClickEvent event) {
              //doubleClickAction.run();
             }
            });
          }

          六,使用TableViewer
          Jface中封裝了talbeViewer TreeViewer等控件,能簡單的實現很多功能,首先說說TableView
          //SWT.FULL_SELECTION 可以選中一整行
          //SWT.MULTI 可以選中多行
          viewer = new TableViewer(wareListGroup, SWT.BORDER | SWT.FULL_SELECTION
              | SWT.MULTI);
            final Table table = viewer.getTable();
            table.setHeaderVisible(true);//顯視表頭
            table.setLinesVisible(true);//顯視表格
            
            //實現點擊表頭自動重新排序
            final TableColumn num = new TableColumn(table, SWT.NONE);
            num.addSelectionListener(new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
              resetSort(WareViewerSort.NUM);
              //resetSort是自己實現的重新排序的函數,只須要把不通的ViewerSort重新設置給
              TableViewer,并刷新
             }
            });
            num.setAlignment(SWT.CENTER);
            num.setWidth(50);
            //這個地方使用了message,只要做過國際話的大概都能明白
            num.setText(Messages.getString("HelloView.warenum")); //$NON-NLS-1$

            final TableColumn name = new TableColumn(table, SWT.NONE);
            name.addSelectionListener(new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
              resetSort(WareViewerSort.NAME);//同上
             }
            });
            name.setWidth(80);
            name.setText(Messages.getString("WareView.warename")); //$NON-NLS-1$
            name.setAlignment(SWT.CENTER);
            
            final TableColumn desc = new TableColumn(table, SWT.NONE);
            desc.addSelectionListener(new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
              resetSort(WareViewerSort.DESC);
             }
            });
            desc.setWidth(110);
            desc.setText(Messages.getString("WareView.waredesc")); //$NON-NLS-1$

            final TableColumn price = new TableColumn(table, SWT.NONE);
            price.addSelectionListener(new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
              resetSort(WareViewerSort.PRICE);
             }
            });
            price.setWidth(70);
            price.setText(Messages.getString("WareView.wareprice")); //$NON-NLS-1$
            price.setAlignment(SWT.RIGHT);

            final TableColumn updDate = new TableColumn(table, SWT.NONE);
            updDate.addSelectionListener(new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
              resetSort(WareViewerSort.UPDDATE);
             }
            });
            updDate.setWidth(150);
            updDate.setText(Messages.getString("WareView.wareupddate")); //$NON-NLS-1$
            updDate.setAlignment(SWT.CENTER);
            //一個TableViewer里邊的數據變動主要取決于下邊四句
            viewer.setContentProvider(new WareContentProvider()); //表的顯視
            viewer.setLabelProvider(new WareLabelProvider());    //表的數據提供者

            viewer.setInput(//真實的數據來源); //數據來源例如ArrayList等
            viewer.setSorter(new WareViewerSort()); //排序
            
          兩個provider的實現類似下邊的情況  
          class WareContentProvider implements IStructuredContentProvider {

            public Object[] getElements(Object inputElement) {
             if (inputElement instanceof Node) {
              ArrayList list = new ArrayList();
              makeWareList(((Node) inputElement), list);
              return list.toArray();
             }
             if (inputElement instanceof List) {
              return ((List) inputElement).toArray();
             }
             return null;
            }

            public void dispose() {
             // TODO Auto-generated method stub

            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
             // TODO Auto-generated method stub

            }

           }

          class WareLabelProvider extends LabelProvider implements
             ITableLabelProvider {

            public Image getColumnImage(Object element, int columnIndex) {
             // TODO Auto-generated method stub
             return null;
            }

            public String getColumnText(Object element, int columnIndex) {
             if (element instanceof Ware) {
              switch (columnIndex) {
              case 0:
               return ((Ware) element).getDisplayNum();
              case 1:
               return ((Ware) element).getDisplayName();
              case 2:
               return ((Ware) element).getDisplayDesc();
              case 3:
               return ((Ware) element).getDisplayPrice();
              case 4:
               return ((Ware) element).getDisplayUpdDate();
              default:
               break;
              }
             }
             return null;
            }

           }
           

          posted on 2006-11-06 14:32 dreamstone 閱讀(4523) 評論(0)  編輯  收藏 所屬分類: SWT和插件開發

          主站蜘蛛池模板: 永登县| 永康市| 稻城县| 资溪县| 东辽县| 尉犁县| 卢湾区| 突泉县| 永嘉县| 剑阁县| 巴楚县| 玛纳斯县| 汕头市| 绥江县| 新营市| 固安县| 怀来县| 沁源县| 敖汉旗| 罗城| 靖州| 井研县| 昌邑市| 饶阳县| 越西县| 永州市| 巨野县| 关岭| 眉山市| 枣强县| 安陆市| 肇州县| 郁南县| 六安市| 正安县| 舟曲县| 南丰县| 达州市| 巩留县| 盱眙县| 莱芜市|