2016-10-11 27 views
0

我正在使用WindowBuilder for Eclipse構建一個帶有SWT的GUI。當您將窗口小部件拖放到WindowBuilder的外殼中時,會自動生成源代碼。但是,所有的widget對象都在createContents函數中聲明。以下是該函數摘錄:如何從偵聽器中訪問小部件?

Button btnStartServer = new Button(shlTest, SWT.NONE); 
btnStartServer.addSelectionListener(new SelectionAdapter() { 
    @Override 
    public void widgetSelected(SelectionEvent e) { 

     // how to access serverStateDisplay right here? 
     // I have access to shlTest (my Shell object), though 
    } 
}); 
btnStartServer.setText("Start Server"); 

Canvas serverStateDisplay = new Canvas(shlTest, SWT.NONE); 

正如你所看到的,我有一個選擇偵聽器獲得,當我點擊按鈕的觸發。現在,我怎樣才能訪問畫布?顯而易見的解決方案,只是寫serverStateDisplay.doWhatever()是行不通的。


我發現this SO question基本上要求同樣的事情。但是,唯一的解決方案是在偵聽器之前聲明引用的小部件或將其聲明爲類實例變量。

這對我來說並不令人滿意,因爲我用WindowBuilder構建了我的UI。 WB無法爲我自動執行此操作嗎?因爲當應用程序增長時,手動更改每個小部件聲明會非常不舒服。


主循環也是如此。通過在createContents函數中聲明的小部件,一旦函數終止,它們就不可訪問。

回答

1

事實上,要訪問一個小部件,您應該聲明它是一個字段,或者嘗試從選擇事件中獲取這個小部件。

就你而言,我寧願將你的畫布暴露爲一個字段。

在Window Builder中,將局部變量作爲字段公開:選擇變量,然後單擊按鈕「Convert local to field」。

enter image description here

+0

非常感謝!現在我還有一個疑問:我是否應該預防性地轉換所有小部件,還是僅以後使用的小部件?這裏最好的做法是什麼? – paolo

+1

我只會轉換你需要從eventHandlers中訪問的小部件。所以你要避免領域的擴散。創建用戶界面非常複雜,我更喜歡僅公開業務邏輯所需的字段。 – psuzzi

相關問題