1
我有一個艱難的時間試圖找出一種方法來正確填充SWT GUI元素,需要一些時間(即:我不希望它掛起APP)。目前我正在這樣做,但我覺得應該有更好的方法。SWT使用線程填充GUI小部件的正確方法?
我之所以做這種方式是因爲:
- 我需要在設置一些小部件
- 您必須始終從展出的asyncExec功能修改SWT部件後臺運行一個任務
- 這是我可以算出它的唯一途徑 - 與創建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);
}
}
}