2016-10-11 26 views
0

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

事实上,要访问一个小部件,您应该声明它是一个字段,或者尝试从选择事件中获取这个小部件。

就你而言,我宁愿将你的画布暴露为一个字段。

在Window Builder中,将局部变量作为字段公开:选择变量,然后单击按钮“Convert local to field”。

enter image description here

+0

非常感谢!现在我还有一个疑问:我是否应该预防性地转换所有小部件,还是仅以后使用的小部件?这里最好的做法是什么? – paolo

+1

我只会转换你需要从eventHandlers中访问的小部件。所以你要避免领域的扩散。创建用户界面非常复杂,我更喜欢仅公开业务逻辑所需的字段。 – psuzzi

相关问题