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

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

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

    子在川上曰

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

    SWT的狀態(tài)欄和進度條的實例

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

    這一節(jié)將實現(xiàn)一個如圖13.2所示的實例。為了能看清更面板的框架,把面板都設(shè)成了邊框型。實例有以下內(nèi)容:

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

    q??????? 如何在狀態(tài)欄中動態(tài)創(chuàng)建進度條,同時如何用完后銷毀它。

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

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

    20061212.jpg??

    13.2 狀態(tài)欄里的進度條



    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);

    ?????????????????? // ---------創(chuàng)建窗口中的其他界面組件-------------

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

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

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

    ?????????????????? // -----------------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("隱藏狀態(tài)欄");

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

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

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

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

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

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

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

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

    ???????????????????????????????????? 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) // 根據(jù)停止標志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);

    ??????????????????????????? // 這一句不能放在線程外執(zhí)行,否則progressBar被創(chuàng)建后就立即被dispose

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

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

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

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

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

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

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

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

    ???????? }

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

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

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

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

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

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

    ?????????????????? //設(shè)置為用行列式布局管理狀態(tài)欄里的組件

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

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

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

    ?????????????????? //創(chuàng)建一個用于顯示文字的標簽

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

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

    ???????? }

    ???????? //創(chuàng)建進度條

    ???????? 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的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

    # re: SWT的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

    # re: SWT的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

    # re: SWT的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

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

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

    # re: SWT的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

    # re: SWT的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

    # re: SWT的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

    # re: SWT的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

    # re: SWT的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

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

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

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

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

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

    # re: SWT的狀態(tài)欄和進度條的實例  回復(fù)  更多評論   

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

    # re: SWT的狀態(tài)欄和進度條的實例[未登錄]  回復(fù)  更多評論   

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

    # re: SWT的狀態(tài)欄和進度條的實例[未登錄]  回復(fù)  更多評論   

    老陳,怎么修改進度條上面的Loading workbench ....???
    2010-03-22 18:03 | 哈哈
    主站蜘蛛池模板: 24小时日本在线www免费的| 蜜桃精品免费久久久久影院| 亚洲视频精品在线观看| 成年女人看片免费视频播放器 | 手机在线看永久av片免费| 亚洲欧美日韩国产成人| 亚洲精品网站在线观看不卡无广告 | 亚洲中文字幕人成乱码| 日韩激情淫片免费看| 久久久久久久久久免免费精品 | 亚洲日韩VA无码中文字幕| 99在线在线视频免费视频观看| 亚洲一区AV无码少妇电影| 亚洲午夜成人精品电影在线观看| 免费无码又爽又刺激高潮视频| 久久久久亚洲国产AV麻豆| 亚洲国产高清视频| 无码欧精品亚洲日韩一区夜夜嗨| 久久青草国产免费观看| 大桥未久亚洲无av码在线| 亚洲国产精品第一区二区| 国产免费131美女视频| 91禁漫免费进入| 一级毛片**免费看试看20分钟| 亚洲a级片在线观看| 国产午夜亚洲不卡| 免费看大美女大黄大色| 久久久久久影院久久久久免费精品国产小说| 亚洲日本一线产区和二线 | 亚洲香蕉网久久综合影视| 无码高潮少妇毛多水多水免费| 在线播放免费人成毛片乱码| 国产精品亚洲一区二区在线观看| 亚洲毛片基地日韩毛片基地| 亚洲色欲色欲www在线丝| 免费欧洲美女牲交视频| 色窝窝免费一区二区三区| 最近中文字幕mv免费高清在线| 国产免费福利体检区久久| 黄页免费视频播放在线播放| 中国亚洲呦女专区|