3

それらを定義するクラス外のGUIコンポーネントにアクセスする必要があります。私のGUIクラスには、オブジェクトを配置するための次のコードが含まれています。

/**
 * Create contents of the window.
 */
protected void createContents() {
    shlCertificatesmanager = new Shell(Display.getDefault());
    shlCertificatesmanager.setSize(450, 300);
    shlCertificatesmanager.setText("CertificatesManager");
    shlCertificatesmanager.setLayout(new RowLayout(SWT.HORIZONTAL));
    MenuItemListener menuListener = new MenuItemListener(shlCertificatesmanager);

    Menu menu = new Menu(shlCertificatesmanager, SWT.BAR);
    shlCertificatesmanager.setMenuBar(menu);

    MenuItem mntmNewSubmenu = new MenuItem(menu, SWT.CASCADE);
    mntmNewSubmenu.setText("File");     

    Menu menu_1 = new Menu(mntmNewSubmenu);
    mntmNewSubmenu.setMenu(menu_1);

    MenuItem mntmOpenCertificate = new MenuItem(menu_1, SWT.NONE);
    mntmOpenCertificate.setText("Open Certificate");
    mntmOpenCertificate.addSelectionListener(menuListener);

    MenuItem mntmExit = new MenuItem(menu_1, SWT.NONE);
    mntmExit.addSelectionListener(menuListener);
    mntmExit.setText("Exit");

    MenuItem mntmHelp = new MenuItem(menu, SWT.CASCADE);        
    mntmHelp.setText("Help");

    Menu menu_2 = new Menu(mntmHelp);
    mntmHelp.setMenu(menu_2);

    MenuItem mntmAbout = new MenuItem(menu_2, SWT.NONE);
    mntmAbout.setText("About");
    mntmAbout.addSelectionListener(menuListener);

    Label lblAliasName = new Label(shlCertificatesmanager, SWT.NONE);
    lblAliasName.setText("Alias name: ");

    Label label = new Label(shlCertificatesmanager, SWT.NONE);
    label.setText("___________");

}

ここで、外部クラスからこれらのコンポーネントの一部にアクセスする必要があります。その場合、MenuItemListenerクラスから2つのラベル(lblAliasName、label)にアクセスする必要があります。

それらにアクセスする方法はありますか?(おそらく、findViewByIdメソッドなどを備えたAndroidのように?)

または、たとえば、他のクラスから何らかの方法でアクセスできるようにする必要がありますか?(MenuItemListenerクラスとGuiWindowクラスの両方で使用されるGUIコンポーネントの計算を作成します)

4

2 に答える 2

2

2つのオプションが頭に浮かびます。

  1. クラスのインスタンスが1つしかない場合は、コンポーネントをstaticフィールドとして宣言し、getterメソッドを介してそれらを渡します。
  2. 複数のインスタンスがある場合は、コンポーネントをフィールドとして宣言し(今回はそうではありませんstatic)、getterメソッドを作成します。もちろん、他のクラスは、メソッドにアクセスするためにクラスのインスタンスを知っている必要があります。

覚えておいてください:

GUIスレッドではないスレッドからコンポーネントを変更しようとすると、SWTExceptionwith値が取得されますERROR_THREAD_INVALID_ACCESS

これは、次を使用して解決できます。

Display.getDefault().asyncExec(new Runnable() {
    public void run() {
        // change/modify components here
    }
});
于 2012-10-31T09:33:41.767 に答える
1

いいえ、これを行う標準的な方法はありません。Javaで通常どおりアクセスできるようにする必要があります。

于 2012-10-31T10:16:03.157 に答える