2011-08-25 58 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取回數據,以及一個相當標準的事情。