SWT访问gui组件

时间:2012-10-31 09:21:53

标签: java swt

我需要访问定义它们的类之外的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,label)。

有办法访问它们吗? (或者像使用findViewById方法或类似的Android?)

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

2 个答案:

答案 0 :(得分:2)

我想到了两个选择:

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

    如果您尝试从不是gui-thread的线程更改组件,您将获得值SWTException的{​​{1}}。

    您可以使用以下方法解决此问题:

    ERROR_THREAD_INVALID_ACCESS

答案 1 :(得分:1)

不,没有标准的方法可以做到这一点,你需要像往常一样在Java中使用它们。