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 类访问两个标签(lblAliasName,标签)。

有办法访问它们吗?(也许像 Android 的 findViewById 方法或类似方法?)

或者我需要例如让它们以某种方式从其他类访问?(创建一个将被 MenuItemListener 类和 GuiWindow 类使用的 gui 组件的类)

4

2 回答 2

2

我想到了两个选择:

  1. 如果您的类只有一个实例,则将组件声明为static字段并通过 getter 方法将其移交。
  2. 如果有多个实例,则将组件声明为字段(这次不是static)并创建 getter 方法。另一个类当然必须知道你的类的实例才能访问这些方法。

记住:

如果您尝试从不是 gui 线程的线程更改组件,您将得到一个SWTExceptionwith value 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 回答