RCP进度条实战

RCP进度条实战

前文

1.rcp进度条ProgressBar工具是SWT工具包的基本进度条组件,使用该组件可以实现较为简单的进度条功能,本文以平滑进度条为例。

内容

//导入有关的包
import java.awt.Dimension;
import java.awt.Toolkit;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
/**
 * 进度条测试类
 * @author yjru
 *
 */
public class TranProgressBar {
	public ProgressBar pbr;//创建进度条对象
	public Display display;//创建Display对象
	public Shell shell;//创建Shell窗口对象
	public static Label lb;//创建SWT工具包的Label标签组件对象
	
	public TranProgressBar(){  //无参构造函数
	}
	/**
	*创建进度条和标签的基本样式的方法,返回进度监听对象(进度监听对象
	* IProgressMonitor,用来监听进度条 的进度)
	**/
	public IProgressMonitor CreateProgressBar(){
		Display display = new Display();//实例化display
		shell  = new Shell(display,SWT.NONE);//实例化shell窗口,样式为NONE
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();//获得屏幕尺寸,指的是本机(笔记本)屏幕尺寸
		//定义shell窗口的x,y轴坐标以及宽、高,下面的X,Y轴坐标是屏幕的中央。
		shell.setBounds((d.width-320)/2, (d.height-60)/2,320,60);
		//设置shell窗口的布局样式,为网格布局,且每一行,只有一列
		shell.setLayout(new GridLayout(1,false));
		//下面的是shell窗口样式,如果shell没设置背景图片或者颜色,则窗口透明
		shell.setBackgroundMode(SWT.INHERIT_DEFAULT);
		
		
		
	    //创建进度条pbr,样式是平滑型或者说是横向的进度条
		pbr = new ProgressBar(shell,SWT.HORIZONTAL);
		//pbr的X,Y轴,宽、高
		pbr.setBounds((d.width-480)/2, (d.height-60)/2, 480, 60);
		//pbr布局为网格布局,横向为陷进去的样式,纵向为左对齐样式
		pbr.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
		//设置进度条的最大值为25,与下面的子任务方法要对应
		pbr.setMaximum(25);
		//pbr最小值为0,注意,必须设置为>=0的数(应该是整数吧,不太确认)
		pbr.setMinimum(0);
		
		/* Version Label */
		//SWT组件Label创建,样式为空,被shell窗口装入,理解为shell窗口是一个容器,里面放了pbr进度条和lb标签,且shell窗口是网格布局,一行只有一列,则第一行进度条,第二行是标签
		lb = new Label(shell, SWT.NONE);
		//设置lb布局也是网格布局,横向和纵向都是左对齐,横向上一行对齐,纵向不对齐
		lb.setLayoutData(new GridData(SWT.LEFT, SWT.LEFT, true, true));
		/**标签值的设置,注意,这里string的值多输入一些,之后的setText方       
		*法会继承它的长度,如果这里只有三位,之后同样的方法,也只能显示三
		*位数,比如这里是setText(“123”),之后的setText()方法的最大
		*显示也只有三位了,所以这里的值尽可能设置很大。
		**/
		lb.setText("开始加载!!!!!!!!!!!!!!!!!!!"); //$NON-NLS-1$
		
		//打开shell窗口
		shell.open();
		//运行getBundleProgressMonitor方法来创建进度条监听器,并把进度条监听器对象传给 monitor
		IProgressMonitor monitor = getBundleProgressMonitor();//运行进度条的方法,创建两个线程,返回空的进度条监视器
		return monitor;
	}
	
	//进度条监听器方法,这里初步设置了开始主任务和子任务的方法
	public IProgressMonitor getBundleProgressMonitor() { //ProgressMonitor是进度条监视器
		return new NullProgressMonitor() {

			@Override
			//下面的name是主任务名,int类型的totalWork是总共的任务数
			public void beginTask(String name, final int totalWork) {  //启动进度条的方法
			//创建新线程
				shell.getDisplay().syncExec(new Runnable() { 
				//线程方法
					public void run() {
						pbr.setSelection(5);//设置进度条的值为5
					}
				});
			}
			
			@Override
			//进度条监听器的子任务方法,name是子任务名
			public void subTask(String name) {
			//创建新线程
				shell.getDisplay().syncExec(new Runnable() {
				//线程方法
					public void run() {
					//如果当前的进度条值<25,则每次子任务后进度条的值+5
						if (pbr.getSelection() < 25)
							pbr.setSelection(pbr.getSelection() + 5);
					}
				});
			}
		};
	}
	//主方法,测试进度条的功能如何
	public static void main(String[] args) throws InterruptedException{
		TranProgressBar ac = new TranProgressBar();//因为要调用非静态方法,先实例化本类
		IProgressMonitor mo = ac.CreateProgressBar();//本类的CreateProgressBar方法返回的对象值传入“进度监听器”对象
		/**
		 * 开始监听 进度和和 更新进度条的值
		 */
		mo.beginTask("开始", 6);//开启进度条监听器主方法,穿个名字和任务数,一般是主任务1个+自定义的子任务多个,这里子任务5个
		lb.setText("begining");//标签值更新为"begining"
		sleepThread(1000);//线程停止秒
		mo.subTask("1");//开启新的子任务
		lb.setText("第一步子任务");//标签值更新为"第一步子任务"
		mo.worked(1);//子任务线程方法运行一次,这里实际是进度条值+5
		
		sleepThread(1000);
		mo.subTask("2");
		lb.setText("2222222");
		mo.worked(2);
		
		sleepThread(1000);
		mo.subTask("3");
		lb.setText("333333");
		mo.worked(3);
		
		sleepThread(1000);
		mo.subTask("4");
		lb.setText("444444");
		mo.worked(4);
		sleepThread(1000);
		lb.setText("end of");
		sleepThread(1000);
		mo.done();//进度条方法关闭
		ac.shell.dispose();//本类的shell窗口释放掉
		
	}
	
	
	

	//这里封装了线程睡眠方法,接收传入睡眠的时间,方便调用
	public static void sleepThread(long abc){
		try {
			Thread.sleep(abc);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

具体运行动图,看看
在这里插入图片描述

注意事项

1.本文仅供参考,有建议欢迎提出。
2.注意点:(1)label标签的setText方法在定义时最好写出,且string值尽量大,之后的调用会继承它的大小,到时候显示不完全我可不管。
(2)进度条的最大值和进度条监听器 子任务方法内线程方法的<25这里要对应。
(3)shell创建时的display这个是SWT程序和操作系统的桥梁,你在一些类里填display可能报错,这时候RCP程序可以考虑改成:
Shell shell = new Shell(PlatformUI.getWorkbench().getDisplay(),SWT.NONE);
这里的PlatformUI.getWorkbench().getDisplay()会返回一个display对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值