私は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
関数内で宣言されたウィジェットでは、関数が終了するとアクセスできなくなります。
ありがとうございました!もう一つの疑問が私の心にあります:すべてのウィジェットを予防的に変換するのか、それとも後で使用するウィジェットだけに変換するべきなのでしょうか?ここでベストプラクティスは何ですか? – paolo
私はあなたのeventHandlersの中からアクセスする必要があるウィジェットだけを変換します。だからフィールドの拡散を避けてください。 UIの作成は複雑で、ビジネスロジックに必要なフィールドだけを公開することをお勧めします。 – psuzzi