一个仿 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(); } }