2013-07-05 54 views
4

我有SWT(標準小工具工具包)和重繪的問題。基本上我想要點擊按鈕時發生的事情,例如新元素出現。爲了簡單起見,讓它成爲文本。爲什麼Java SWT Selection偵聽器中新創建的元素不會顯示/觸發繪畫事件?

但是,當我點擊按鈕沒有任何反應,沒有元素出現,沒有PaintEvent觸發。當我調整窗口大小時,突然所有的元素都在那裏(因爲那會觸發paintEvent /重繪)。

文檔和博客文章告訴我,無論什麼時候需要重新繪製,都會觸發paint事件。我認爲嚮應用程序添加新元素將屬於該類別。

所以問題是:我在這裏做錯了什麼?我應該手動調用layout()/ redraw()來觸發重繪?這對我來說似乎很乏味,而且我的理解是SWT在大多數情況下爲我處理這個問題。

哦,我用SWT 4.2.2運行Linux x64。但是我們在任何平臺上(以及舊SWT 3.7)都有這個功能。

而且在這裏不用我的小示例代碼:

import org.eclipse.swt.*; 
import org.eclipse.swt.widgets.*; 
import org.eclipse.swt.events.*; 
import org.eclipse.swt.layout.*; 

public class MainExample { 

    public static void createText(Shell shell) { 
     Text text = new Text(shell, SWT.SINGLE); 
     text.setText("here is some fancy text"); 
    } 

    public static void main (String [] args) { 
     Display display = new Display(); 
     Shell shell = new Shell (display); 
     Button button = new Button(shell, SWT.PUSH); 
     button.setText("I am a button"); 

     button.addSelectionListener(new SelectionAdapter() { 
      public void widgetSelected(SelectionEvent e) { 
       System.out.println("Button Clicked"); 
       // Why do these texts not show up and not trigger a Paint Event? 
       createText(e.display.getActiveShell()); 
      } 
     }); 

     createText(shell); 
     shell.setLayout (new RowLayout()); 
     shell.addPaintListener(new PaintListener() { 
      public void paintControl(PaintEvent e) { 
       // just triggered in the beginning and with resizes 
       System.out.println("Hooray we got a Paint event"); 
      } 
     }); 
     shell.open(); 

     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) display.sleep(); 
     } 
     display.dispose(); 
    } 

} 

請記住,這不是純粹的有關使這個例子只是工作。這是一個更大的項目的簡單版本的問題:-)

任何幫助,很好的讚賞!

回答

1

如果您使用佈局,則應在將新子添加到複合後調用Composite.layout()(或佈局(true))。 佈局不知道(所以不要放置小部件),直到你調用layout()。順便說一下,如果您調整shell(複合)的大小,佈局會自動使其內部緩存失效並檢查所有子項,並將其放置。這就是爲什麼在調整外殼大小後出現新創建的文本。

+0

我擔心這將是答案..非常感謝你:-) – PragTob

相關問題