子在川上曰

            逝者如斯夫不舍晝夜
          隨筆 - 71, 文章 - 0, 評論 - 915, 引用 - 0
          數據加載中……

          SWT的狀態欄和進度條的實例

          網站很久沒更新了,最近忙著寫《Eclipse從入門到精通》的第二版,因為SWT API變化的原因,程序全驗證了一篇,有些實例重寫了,還增加了很多內容。這里是新增的一個實例,來源于一個讀者的提問。

          這一節將實現一個如圖13.2所示的實例。為了能看清更面板的框架,把面板都設成了邊框型。實例有以下內容:

          q??????? 如何創建一個簡單的狀態欄(基于RCP平臺能夠直接使用它的進度條服務)

          q??????? 如何在狀態欄中動態創建進度條,同時如何用完后銷毀它。

          q??????? 如何用exclude屬性、setVisiblelayout方法來動態顯示/隱藏面板或組件。

          q??????? 再次表明在一個線程Thread里調用SWT組件都要用display.asyncExec()包裝一下,而且還要在使用組件前對其是否被銷毀做判斷

          20061212.jpg??

          13.2 狀態欄里的進度條



          import org.eclipse.swt.SWT;
          import org.eclipse.swt.events.SelectionAdapter;
          import org.eclipse.swt.events.SelectionEvent;
          import org.eclipse.swt.layout.GridData;
          import org.eclipse.swt.layout.GridLayout;
          import org.eclipse.swt.layout.RowData;
          import org.eclipse.swt.layout.RowLayout;
          import org.eclipse.swt.widgets.Button;
          import org.eclipse.swt.widgets.Composite;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Label;
          import org.eclipse.swt.widgets.ProgressBar;
          import org.eclipse.swt.widgets.Shell;

          public
          class ProgressBar3 {

          ???????? private Display display;

          ???????? private Shell shell;

          ???????? private Composite statusbar;

          ???????? private Label statusbarLabel;

          ???????? private ProgressBar progressBar;

          ???????? private Button hideProbarButton;

          ???????? publicstaticvoid main(String[] args) {????? new ProgressBar3().open();???? }

          ???????? privatevoid open() {

          ?????????????????? display = Display.getDefault();

          ?????????????????? shell = new Shell();

          ?????????????????? shell.setSize(250, 170);

          ?????????????????? // ---------創建窗口中的其他界面組件-------------

          ?????????????????? shell.setLayout(new GridLayout());

          ?????????????????? createMainComp(shell);//創建主面板

          ?????????????????? createStatusbar(shell);//創建工具欄

          ?????????????????? // -----------------END------------------------

          ?????????????????? shell.layout();

          ?????????????????? shell.open();

          ?????????????????? while (!shell.isDisposed()) {

          ??????????????????????????? if (!display.readAndDispatch())

          ???????????????????????????????????? display.sleep();

          ?????????????????? }

          ?????????????????? display.dispose();

          ???????? }

          ???????? privatevoid createMainComp(Composite parent) {

          ?????????????????? Composite comp = new Composite(parent, SWT.BORDER);

          ?????????????????? comp.setLayoutData(new GridData(GridData.FILL_BOTH));

          ?????????????????? comp.setLayout(new RowLayout());

          ?????????????????? createButton(comp);

          ???????? }

          ???????? privatevoid createButton(Composite parent) {

          ?????????????????? final Button b1 = new Button(parent, SWT.NONE);

          ?????????????????? b1.setText("隱藏狀態欄");

          ?????????????????? b1.addSelectionListener(new SelectionAdapter() {

          ??????????????????????????? privatebooleanflag = true;

          ??????????????????????????? publicvoid widgetSelected(SelectionEvent e) {

          ???????????????????????????????????? // statusbar.setVisible(false)來隱藏狀態欄是不夠的,還必須把它占用的空間也釋放出來,這時應該用GridData.exclude

          ???????????????????????????????????? GridData data = (GridData) statusbar.getLayoutData();

          ???????????????????????????????????? data.exclude = flag;

          ???????????????????????????????????? shell.layout();

          ???????????????????????????????????? b1.setText((flag ? "顯示" : "隱藏") + "狀態欄");

          ???????????????????????????????????? flag = !flag;

          ??????????????????????????? }

          ?????????????????? });

          ?????????????????? hideProbarButton = new Button(parent, SWT.NONE);

          ?????????????????? hideProbarButton.setText("隱藏進度條");

          ?????????????????? hideProbarButton.setEnabled(false);

          ?????????????????? hideProbarButton.addSelectionListener(new SelectionAdapter() {

          ??????????????????????????? privatebooleanflag = false;

          ??????????????????????????? publicvoid widgetSelected(SelectionEvent e) {

          ???????????????????????????????????? progressBar.setVisible(flag);

          ???????????????????????????????????? hideProbarButton.setText((flag ? "隱藏" : "顯示") + "進度條");

          ???????????????????????????????????? flag = !flag;

          ??????????????????????????? }

          ?????????????????? });

          ?????????????????? final Button b3 = new Button(parent, SWT.NONE);

          ?????????????????? b3.setText(" GO ");

          ?????????????????? b3.addSelectionListener(new SelectionAdapter() {

          ??????????????????????????? privatebooleanstopFlag = true;

          ??????????????????????????? publicvoid widgetSelected(SelectionEvent e) {

          ???????????????????????????????????? stopFlag = !stopFlag;

          ???????????????????????????????????? if (stopFlag) // 根據停止標志stopFlag來判斷是停止還是運行

          ?????????????????????????????????????????????? stop();

          ???????????????????????????????????? else

          ?????????????????????????????????????????????? go();

          ??????????????????????????? }

          ??????????????????????????? privatevoid stop() {

          ???????????????????????????????????? b3.setEnabled(false);// 停止需要時間,在完全停止前要防止再次開始。

          ???????????????????????????????????? b3.setText("GO");

          ??????????????????????????? }

          ??????????????????????????? privatevoid go() {

          ???????????????????????????????????? b3.setText("STOP");

          ???????????????????????????????????? progressBar = createProgressBar(statusbar);

          ???????????????????????????????????? hideProbarButton.setEnabled(true);

          ???????????????????????????????????? statusbar.layout();// 重新布局一下工具欄,使進度條顯示出來

          ???????????????????????????????????? new Thread() {

          ?????????????????????????????????????????????? publicvoid run() {

          ??????????????????????????????????????????????????????? for (int i = 1; i < 11; i++) {

          ???????????????????????????????????????????????????????????????? if (display.isDisposed() || stopFlag) {

          ?????????????????????????????????????????????????????????????????????????? disposeProgressBar();

          ?????????????????????????????????????????????????????????????????????????? return;

          ???????????????????????????????????????????????????????????????? }

          ???????????????????????????????????????????????????????????????? moveProgressBar(i);

          ???????????????????????????????????????????????????????????????? try {? Thread.sleep(1000);????????? } catch (Throwable e2) {} //停一秒

          ??????????????????????????????????????????????????????? }

          ??????????????????????????????????????????????????????? disposeProgressBar();

          ?????????????????????????????????????????????? }

          ?????????????????????????????????????????????? privatevoid moveProgressBar(finalint i) {

          ??????????????????????????????????????????????????????? display.asyncExec(new Runnable() {

          ???????????????????????????????????????????????????????????????? publicvoid run() {

          ?????????????????????????????????????????????????????????????????????????? if (!statusbarLabel.isDisposed())

          ??????????????????????????????????????????????????????????????????????????????????? statusbarLabel.setText("前進到第" + i + "");

          ?????????????????????????????????????????????????????????????????????????? if (!progressBar.isDisposed())

          ??????????????????????????????????????????????????????????????????????????????????? progressBar.setSelection(i * 10);

          ???????????????????????????????????????????????????????????????? }

          ??????????????????????????????????????????????????????? });

          ?????????????????????????????????????????????? }

          ?????????????????????????????????????????????? privatevoid disposeProgressBar() {

          ??????????????????????????? ??????????????????????????? if (display.isDisposed())?? return;

          ??????????????????????????????????????????????????????? display.asyncExec(new Runnable() {

          ???????????????????????????????????????????????????????????????? publicvoid run() {

          ?????????????????????????????????????????????????????????????????????????? hideProbarButton.setEnabled(false);

          ??????????????????????????? // 這一句不能放在線程外執行,否則progressBar被創建后就立即被dispose

          ?????????????????????????????????????????????????????????????????????????? progressBar.dispose();

          ?????????????????????????????????????????????????????????????????????????? b3.setEnabled(true);

          ???????????????????????????????????????????????????????????????? }

          ??????????????????????????????????????????????????????? });

          ?????????????????????????????????????????????? }

          ???????????????????????????????????? }.start();

          ??????????????????????????? }

          ?????????????????? });

          ???????? }

          ???????? privatevoid createStatusbar(Composite parent) {

          ?????????????????? statusbar = new Composite(parent, SWT.BORDER);

          ?????????????????? //設置工具欄在Shell中的形狀為水平搶占充滿,并高19像素

          ?????????????????? GridData gridData = new GridData(GridData.FILL_HORIZONTAL);

          ?????????????????? gridData.heightHint = 19;

          ?????????????????? statusbar.setLayoutData(gridData);

          ?????????????????? //設置為用行列式布局管理狀態欄里的組件

          ?????????????????? RowLayout layout = new RowLayout();

          ?????????????????? layout.marginLeft = layout.marginTop = 0; //無邊距

          ?????????????????? statusbar.setLayout(layout);

          ?????????????????? //創建一個用于顯示文字的標簽

          ?????????????????? statusbarLabel = new Label(statusbar, SWT.BORDER);

          ?????????????????? statusbarLabel.setLayoutData(new RowData(70, -1));

          ???????? }

          ???????? //創建進度條

          ???????? private ProgressBar createProgressBar(Composite parent) {

          ?????????????????? ProgressBar progressBar = new ProgressBar(parent, SWT.SMOOTH);

          ?????????????????? progressBar.setMinimum(0); // 最小值

          ?????????????????? progressBar.setMaximum(100);// 最大值

          ?????????????????? return progressBar;

          ???????? }

          }

          posted on 2006-12-12 22:15 陳剛 閱讀(10020) 評論(14)  編輯  收藏 所屬分類: Eclipse

          評論

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          SWT 固然好, 但是要命的是它的 API 老是變來變去, 寫的老 Plugin 在平臺一升級就不能用了, 這也是 SWT 相對于 Swing 來說為數不多的缺點之一: 兼容性太差, 起碼自己的新版本兼容自己的老版本, 或者 API 要穩定一下嘛.. 沒人控制它的前后兼容性.
          2006-12-13 09:58 | BeanSoft

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          swt基本是向下兼容的,pugin是eclipse的問題和swt基本沒什么關系
          2006-12-13 21:20 | jrobot[匿名]

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          我現在仍然看不到進度條啊?
          2006-12-15 11:24 | Warren.Wu

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          陳老師:
          你在準備第二版?這可真是個好消息!能先透漏一下增加了那些新的東西嗎?經常去書店,發現還是你的書講的詳細,設身處地的在為初學者著想!

          我想說說我的想法:
          書中的內容不要包容的太多,因為我怕最后由于篇幅所限或出版社的原因導致基礎的東西講不夠,高深的東西講不透。市面上有很多這樣的書,比如其他出版社出的《精通ecilpse》之類的,很令人討厭!這些書只是在介紹eclipse能做什么,但卻教不會讀者用eclispe怎樣做。

          圖13.2的截面是那個系統下的,很漂亮嘛!告訴我吧
          2006-12-30 15:47 | 高井林

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          我暈!被擺了一道,原來是XP的皮膚
          2007-03-14 15:56 | 催月淚

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          把 go()方法中的 hideProbarButton.setEnabled(true); 改成progressBar.setEnabled(true); 就可以看到進度條了。
          2007-05-11 11:33 | 還是老妖

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          還是不能顯示進度條??!
          2007-05-24 01:09 | elvis

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          不能顯示是因為shell的size太小,水平拖動一下就可以了
          2007-08-21 11:36 | swewe

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          為什么我設置的進度條樣式是SWT.SMOOTH,結果顯示出來的還是方格型的,好奇怪~!

          另外,我想讓進度條是垂直時,它的默認推進方式是向上推進的,我想做成向下推進的,不知道怎么實現?
          2007-08-22 16:06 | cs

          # 為什么我設置的進度條樣式是SWT.SMOOTH,結果顯示出來的還是方格型  回復  更多評論   

          為什么連陳剛老師寫的程序,在我這里運行還是方格的,根本不是平滑的呢?
          2008-04-19 10:48 | tt

          # 為什么我設置的進度條樣式是SWT.SMOOTH,結果顯示出來的還是方格型  回復  更多評論   

          等待陳剛老師解答,我試了很多次,把所有的都試便了,還是改變不了
          2008-04-19 10:50 | tt

          # re: SWT的狀態欄和進度條的實例  回復  更多評論   

          有可能是你 windows的原因。
          2008-04-21 22:00 | 陳 剛

          # re: SWT的狀態欄和進度條的實例[未登錄]  回復  更多評論   

          GridData.exclude屬性是swt3.1里面的,3.0以前沒有怎么辦啊?
          2008-11-25 14:09 | aa

          # re: SWT的狀態欄和進度條的實例[未登錄]  回復  更多評論   

          老陳,怎么修改進度條上面的Loading workbench ....???
          2010-03-22 18:03 | 哈哈
          主站蜘蛛池模板: 鄂伦春自治旗| 班玛县| 农安县| 琼海市| 溆浦县| 苍南县| 玉溪市| 商洛市| 密云县| 榆社县| 宝坻区| 辽中县| 阿荣旗| 手机| 岫岩| 桐梓县| 丹江口市| 台山市| 新巴尔虎左旗| 金华市| 金秀| 兴宁市| 南开区| 汶川县| 平阳县| 富宁县| 永济市| 聊城市| 嘉义县| 诸城市| 商南县| 准格尔旗| 罗江县| 汽车| 涡阳县| 上思县| 拉孜县| 二手房| 苗栗市| 冕宁县| 蒲江县|