2013-02-09 50 views
0

自1996年以來,我寫了很多java代碼,但從未嘗試過SWT。雖然我會選擇一些非常簡單的開始,但是我很早就陷入了困境,即使在我面前有幾本SWT/Jface/RCP書籍,這些書籍並不能幫助我解決問題。Java SWT更新文本控制

我試圖讓一個命令行應用程序在SWT窗口中運行。它不需要來自用戶的任何輸入,它只需要顯示sysout。該應用程序很少會生成超過30行的sysout。

public class TestGui implements Runnable { 

private Display display; 
private Shell shell; 
private Text text; 

public void run() { 
    display = new Display(); 
    shell = new Shell(display, SWT.DIALOG_TRIM); 
    shell.setText("SWT Test"); 
    shell.setSize(new Point(800, 400)); 
    shell.setLayout(new FillLayout()); 
    text = new Text(shell, SWT.MULTI | SWT.V_SCROLL | SWT.READ_ONLY); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
} 

void addMessage(String s) { 
    text.append(s); 
    text.append("\n"); 
} 

void close() { 
    display.dispose(); 
} 

public static void main(String[] args) { 
    TestGui pr = new TestGui(); 
    pr.run(); 
    pr.addMessage("add some text"); 
    pr.close(); 
} 
} 

我運行這個,我看到窗口的光標閃爍,但沒有別的出現在它。我似乎無法調用addMessage()方法直到我關閉該窗口,當然這時Shell被釋放,所以我得到一個異常。

我敢肯定,我已經錯過了關鍵的一步......

感謝

克里斯

回答

2

的問題是,while循環在你run方法等待直到顯示是實際配置了,所以這種方式run方法只能在後完成顯示配置。

我不是SWT的專家,但嘗試while循環移動到您main方法,或呼叫(縣)addMessage進入你run方法。無論採取何種方式,您必須在之前添加消息,等待幀被丟棄。

+1

+1絕對正確。這個構造被稱爲事件循環。 [這裏](http://www.vogella.com/articles/SWT/article.html#swt_eventloop)是一個關於如何編寫SWT應用程序的非常好的教程。 – Baz 2013-02-09 19:34:37

+0

其實我需要做的是把實際添加消息的代碼放到一個單獨的線程中。 – casgage 2013-03-07 11:14:33

0

我發佈的原始示例中的問題是添加消息的代碼從未得到執行,正如答覆所述。所以我分離出一個單獨的線程並從那裏調用消息。我仍然在努力,當我有時間讓這一切正常工作時,我會進行更新。