<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    子在川上曰

      逝者如斯夫不舍晝夜
    隨筆 - 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 陳剛 閱讀(10014) 評論(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 | 哈哈
    主站蜘蛛池模板: 久久精品国产亚洲AV蜜臀色欲| 免费观看四虎精品国产永久| 国产亚洲精品激情都市| 国产成人亚洲精品91专区高清| 精品国产免费观看| 综合偷自拍亚洲乱中文字幕| 免费a级毛片在线观看| 久久九九免费高清视频 | 337p欧洲亚洲大胆艺术| 四虎国产精品永久免费网址| 亚洲∧v久久久无码精品 | 亚洲AV成人精品网站在线播放| 亚洲第一页日韩专区| 老司机精品免费视频| 久久精品国产亚洲AV网站 | 激情综合亚洲色婷婷五月 | 免费在线看v网址| 亚洲综合无码无在线观看| 免费一级特黄特色大片在线观看| 中文字幕影片免费在线观看| 国产亚洲精品欧洲在线观看| 亚洲日韩精品国产3区| 亚洲日韩乱码中文无码蜜桃臀网站| 99热在线观看免费| 亚洲欧美在线x视频| 亚洲精华液一二三产区| 亚洲成AV人片在| 国产精品色午夜视频免费看| 成人免费av一区二区三区| 一个人免费观看视频在线中文 | 国产在线精品观看免费观看| 亚洲av无码一区二区三区乱子伦| 亚洲一区二区三区偷拍女厕| 国产成人亚洲精品狼色在线| 在线观看av永久免费| 1000部国产成人免费视频| 久久亚洲精品11p| 亚洲精品福利在线观看| 国产jizzjizz免费看jizz| 国产成人高清精品免费软件| 国产一区二区三区在线免费|