2011-08-25 83 views
1

我有一个艰难的时间试图找出一种方法来正确填充SWT GUI元素,需要一些时间(即:我不希望它挂起APP)。目前我正在这样做,但我觉得应该有更好的方法。SWT使用线程填充GUI小部件的正确方法?

我之所以做这种方式是因为:

  1. 我需要在设置一些小部件
  2. 您必须始终从展出的asyncExec功能修改SWT部件后台运行一个任务
  3. 这是我可以算出它的唯一途径 - 与创建2个线程调用函数 - 胡说八道,乱

原谅任何代码中的错误 - 我是从一封复制和粘贴xisting项目。

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

您也可以调查Jobs API,但它是做一个线程一些工作,然后调用asyncExec取回数据,以及一个相当标准的事情。