2016-10-11 7 views
0

私はWindowBuilder for Eclipseを使用してSWTを使用してGUIを構築しています。 WindowBuilderのシェルにdrag'n'dropウィジェットをドラッグすると、ソースコードが自動的に生成されます。ただし、すべてのウィジェットオブジェクトは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で、ローカル変数をフィールドとして公開するには、変数を選択し、[ローカルに変換]ボタンをクリックします。

enter image description here

+0

ありがとうございました!もう一つの疑問が私の心にあります:すべてのウィジェットを予防的に変換するのか、それとも後で使用するウィジェットだけに変換するべきなのでしょうか?ここでベストプラクティスは何ですか? – paolo

+1

私はあなたのeventHandlersの中からアクセスする必要があるウィジェットだけを変換します。だからフィールドの拡散を避けてください。 UIの作成は複雑で、ビジネスロジックに必要なフィールドだけを公開することをお勧めします。 – psuzzi

関連する問題