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

时间:2016-10-11 15:49:45

标签: java swt windowbuilder

我正在使用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);

正如你所看到的,我有一个选择监听器,当我点击一个按钮时会触发它。现在,我该如何访问画布?显而易见的解决方案,简单地写serverStateDisplay.doWhatever()是行不通的。

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

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

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

1 个答案:

答案 0 :(得分:1)

实际上,要访问窗口小部件,您应该将其声明为字段或尝试从选择事件中获取窗口小部件。

在你的情况下,我更喜欢将你的画布暴露为一个字段。

在Window Builder中,将局部变量公开为字段:选择变量,然后单击按钮"将本地转换为字段"。

enter image description here