【问题标题】:SWT Access gui componentsSWT 访问 gui 组件
【发布时间】:2012-10-31 09:21:53
【问题描述】:

我需要访问定义它们的类之外的 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 方法或类似方法?)

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

【问题讨论】:

    标签: java swt


    【解决方案1】:

    我想到了两个选项:

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

    记住:

    如果您尝试从不是 gui 线程的线程更改组件,您将得到一个值为 ERROR_THREAD_INVALID_ACCESSSWTException

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

    Display.getDefault().asyncExec(new Runnable() {
        public void run() {
            // change/modify components here
        }
    });
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 2015-01-10
        • 2011-08-08
        • 1970-01-01
        相关资源
        最近更新 更多