如何从侦听器中访问小部件?

How to access widgets from within listener?

我正在使用 WindowBuilder for Eclipse 使用 SWT 构建 GUI。当您将小部件拖放到 WindowBuilder 中的 shell 上时,您的源代码会自动生成。但是,所有小部件对象都在 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);

如您所见,我有一个选择侦听器,当我单击按钮时它会被触发。现在,我怎样才能访问 canvas?显而易见的解决方案,简单地写 serverStateDisplay.doWhatever() 是行不通的。


我发现 this SO question 本质上问的是同样的事情。但是,唯一的解决方案是要么在侦听器之前声明引用的小部件,要么将其声明为 class 实例变量。

这对我来说并不令人满意,因为我使用 WindowBuilder 构建了 UI。 WB 不能自动为我做这件事吗?因为当应用程序增长时,手动更改每个小部件声明会很不舒服。


主循环也是如此。对于在 createContents 函数内声明的小部件,一旦函数终止就无法访问它们。

确实,要访问小部件,您应该将其声明为一个字段或尝试从 selection 事件中获取小部件。

对于您的情况,我更愿意将您的 canvas 公开为一个字段。

在 Window Builder 中,将局部变量公开为字段:select 变量,然后单击按钮 "Convert local to field"。