前文
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对象