zoukankan      html  css  js  c++  java
  • SET/JFace ProgressIndicator的使用以及来回滚动进度条实际使用示例

           关于进度条的意义,不多说了,之前了解过SWT的ProgressBar,网上教程很多,自己测试也没问题,但是当我尝试将这个东西应用到实际项目中时,才发现真的好难,因为实际的项目中,长时间处理的东西都在主线程中,一旦执行起这些任务,SWT的这个进度条就动不了了,特别麻烦,后来反编译了TC的登录界面,发现用了一个叫ProgressIndicator的东西,一看源码,原来是JFace的东西,稍微研究了下,确实比较好用,原来以为JFace把线程那些都封装了,只要调用就可以,兴致勃勃地用到项目里,结果一执行,又傻眼了,还是跟SWT的那个一样,进度条不动!后来还是用多线程实现了功能,在新开辟的线程里,我可以处理自己的业务,然后再将相应结果显示在界面上,例子里是计算圆周率的算法,比较耗时间。感觉比那些教程里直接线程休眠比较容易理解。

      1 import org.eclipse.jface.dialogs.ProgressIndicator;
      2 import org.eclipse.swt.SWT;
      3 import org.eclipse.swt.events.SelectionAdapter;
      4 import org.eclipse.swt.events.SelectionEvent;
      5 import org.eclipse.swt.widgets.Button;
      6 import org.eclipse.swt.widgets.Display;
      7 import org.eclipse.swt.widgets.Label;
      8 import org.eclipse.swt.widgets.Shell;
      9 
     10 public class ProgressIndicatorTest {
     11 
     12     protected Shell shell;
     13     private ProgressIndicator progressIndicator;
     14     private Label lblNewLabel;
     15     private double result;
     16 
     17     /**
     18      * Launch the application.
     19      * @param args
     20      */
     21     public static void main(String[] args) {
     22         try {
     23             ProgressIndicatorTest window = new ProgressIndicatorTest();
     24             window.open();
     25         } catch (Exception e) {
     26             e.printStackTrace();
     27         }
     28     }
     29 
     30     /**
     31      * Open the window.
     32      */
     33     public void open() {
     34         Display display = Display.getDefault();
     35         createContents();
     36         shell.open();
     37         shell.layout();
     38         while (!shell.isDisposed()) {
     39             if (!display.readAndDispatch()) {
     40                 display.sleep();
     41             }
     42         }
     43     }
     44 
     45     /**
     46      * Create contents of the window.
     47      */
     48     protected void createContents() {
     49         shell = new Shell(SWT.CLOSE);
     50         shell.setSize(350, 80);
     51         shell.setText("圆周率计算");
     52         shell.setLayout(null);
     53         
     54         Button btnNewButton = new Button(shell, SWT.NONE);
     55         btnNewButton.setBounds(128, 28, 81, 20);
     56         btnNewButton.setText("计算");
     57         
     58         progressIndicator = new ProgressIndicator(shell,SWT.BORDER);
     59         progressIndicator.setBounds(0, 15, 350, 10);
     60         
     61         lblNewLabel = new Label(shell, SWT.NONE);
     62         lblNewLabel.setBounds(0, 0, 350, 16);
     63         lblNewLabel.setAlignment(SWT.CENTER);
     64         lblNewLabel.setText("");
     65 
     66         btnNewButton.addSelectionListener(new SelectionAdapter() {
     67             @Override
     68             public void widgetSelected(SelectionEvent e) {
     69                 btnNewButton.setEnabled(false);
     70                 progressIndicator.beginAnimatedTask();
     71                 lblNewLabel.setText("正在计算,请稍后...");
     72                 new Thread(new Runnable() {
     73                     
     74                     @Override
     75                     public void run() {
     76                         long start = System.currentTimeMillis();
     77                         result = start(10000000000L);
     78                         long end = System.currentTimeMillis();
     79                         long time = (end-start)/100;
     80                         final float t = time/10.0f;
     81                         Display.getDefault().syncExec(new Runnable() {
     82                             
     83                             @Override
     84                             public void run() {
     85                                 lblNewLabel.setText("计算完成,耗时:"+t+"秒  计算结果为:"+result);
     86                                 progressIndicator.done();
     87                                 btnNewButton.setEnabled(true);
     88                             }
     89                         });
     90                     }
     91                 }).start();
     92             }
     93             private double start(long n){
     94                 int i = 1;
     95                 double x = 0d;
     96                 while(i<=n){
     97                     if(i%2==0){
     98                         x = x-1.00/(2*i-1);
     99                     }else{
    100                         x = x+1.00/(2*i-1);
    101                     }
    102                     i++;
    103                 }
    104                 return x*4;
    105             }
    106         });
    107     }
    108 }

          

  • 相关阅读:
    C++中的ravalue学习笔记
    C++中的抽象类
    C++中的显式类型转换
    C++中的继承和多继承
    C++中的多态
    Yocto学习笔记
    HIDL学习笔记
    hadoop2.5搭建过程
    《Redis设计与实现》学习笔记
    40 数组中只出现一次的数字
  • 原文地址:https://www.cnblogs.com/plumsq/p/8418624.html
Copyright © 2011-2022 走看看