现在的位置: 首页 > 综合 > 正文

一个仿 Eclipse 欢迎窗口的代码 – FormLayout典型示例

2013年09月01日 ⁄ 综合 ⁄ 共 2466字 ⁄ 字号 评论关闭

一个仿 Eclipse 欢迎窗口的代码

一个背景图片,最下方是一个进度条,上面有一个label,显示一些信息

技术点总结:

一、窗口居中

二、Form布局

三、SWT UI线程调度(本例实现了一个假的),注意到,只有UI线程才能操作UI的控件。

在别的Windows中 new WelcomeWindow().open()即可,此Windows执行完加载任务后会自动关闭。

/**
 * Welcome Window
 */
public class WelcomeWindow {

	//private static Logger logger = LoggerFactory.getLogger(WelcomeWindow.class);

	private Shell shell;

	/**
	 * Open the window.
	 */
	public void open() {
		Display display = Display.getDefault();
		createContents();
		configureShell();
		shell.open();
		// shell.layout();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	/**
	 * Configure shell
	 * 
	 * @param shell
	 */
	protected void configureShell() {
		shell.pack();

		Rectangle rctDisplay = shell.getDisplay().getBounds();
		Rectangle rctShell = shell.getBounds();
		int x = (rctDisplay.width - rctShell.width) / 2;
		int y = (rctDisplay.height - rctShell.height) / 2;
		shell.setLocation(x, y);
	}

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shell = new Shell(SWT.ON_TOP);
		shell.setLayout(new FillLayout());

		// Composite as container
		Composite container = new Composite(shell, SWT.NONE);
		FormLayout layout = new FormLayout();
		container.setLayout(layout);

		// ProgressBar
		final ProgressBar bar = new ProgressBar(container, SWT.HORIZONTAL);
		bar.setMinimum(0);
		bar.setMaximum(100);
		final int min = bar.getMinimum();
		final int max = bar.getMaximum();

		FormData formData = null;
		formData = new FormData();
		formData.left = new FormAttachment(0, 0);
		formData.right = new FormAttachment(100, 0);
		formData.bottom = new FormAttachment(100, 0);
		bar.setLayoutData(formData);

		// Label Message
		final Label lblMessage = new Label(container, SWT.INHERIT_DEFAULT);
		lblMessage.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_WHITE));
		formData = new FormData();
		formData.left = new FormAttachment(0, 0);
		formData.right = new FormAttachment(60);
		formData.bottom = new FormAttachment(bar, 0);
		lblMessage.setLayoutData(formData);

		// Label Image
		Label lblImage = new Label(container, SWT.NONE);
		lblImage.setImage(Registry.getImage("logo.bmp"));
		formData = new FormData();
		formData.left = new FormAttachment(0, 0);
		formData.top = new FormAttachment(0, 0);
		lblImage.setLayoutData(formData);

		final int step = 5;
		new Thread(new Runnable() {
			public void run() {
				shell.getDisplay().asyncExec(new Runnable() {
					public void run() {
						for (int i = min; i < max; i += step) {
							if (bar.isDisposed()) {
								return;
							}
							try {
								Thread.sleep(100);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
							String text = GlobalVariable.getResourceBundle().getString("ww.bar.loading");
							text = MessageFormat.format(text, bar.getSelection(), StringUtils.repeat('.', i / step));
							lblMessage.setText(text);
							bar.setSelection(bar.getSelection() + i);
						}
						shell.dispose();
					}
				});
			}
		}).start();
	}

}

抱歉!评论已关闭.