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