SWT使用线程填充GUI小部件的正确方法?

时间:2011-08-25 21:18:17

标签: java multithreading widget swt

我正在努力寻找一种方法来正确填充需要一些时间的SWT GUI元素(即:我不希望它挂起APP)。目前我正在这样做,但我觉得必须有更好的方法。

我必须这样做的原因是:

  1. 我需要在后台运行任务来设置一些小部件
  2. 您必须始终从显示
  3. 上的asyncExec函数修改SWT小部件
  4. 这是我能想出来的唯一方法 - 创建2个调用函数的线程 - 废话,凌乱
  5. 原谅任何代码错误 - 我正在从现有项目中复制和粘贴。

    public class Gui {
        protected Shell shell;
        private Display display;
        private SomeController someController;
        private Label statusLabel;
        public void createControllers(){
            someController = new someController(this);
        }
        public void open() {
            this.display = Display.getDefault();
            createContents();
            shell.open();
            shell.layout();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
        }
        protected void createContents() {
            // Create a bunch of stuff
            statusLabel = new Label(shell, SWT.NONE);
            fd_tabFolder.bottom = new FormAttachment(statusLabel, -6);
    
                Button btnStart = new Button(composite_1, SWT.NONE);
            btnStart.addSelectionListener(new SelectionListener() {
                public void widgetDefaultSelected(SelectionEvent arg0) {
                }
    
                public void widgetSelected(SelectionEvent arg0) {
                    someController.setStatus("some status");
                }           
            });
        }
        private Label getStatusLabel(){
            return(statusLabel);
        }
        public Display getDisplay(){
            return(display);
        }
    }
    public class SomeController {
        private Gui gui;
        private Label statusLabel;
        public SomeController(Gui gui)
            this.gui = gui;
            this.statusLabel = gui.getStatusLabel();
        }
        public void setStatus(String status){
            Thread t = new Thread(new SetStatus(status));
            t.start();
        }
        private void setStatusToGui(String status){
            gui.getDisplay().asyncExec(new SetStatusRunnable(status));
        }
        public class SetStatus implements Runnable{
            private String status;
            public SetStatus(String status){
                this.status = status;
            }
            public void run() {
                setStatusToGui(status);
            }
        }
        public class SetStatusRunnable implements Runnable{
            private String status;
            public SetStatusRunnable(String status){
                this.status = status;
            }
            public void run() {
                statusLabel.setText(status);
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

您还可以调查Jobs API,但在线程上进行一些工作然后调用asyncExec以获取数据是非常标准的事情。