我们使用Eclipse E4构建了一个GUI。现在我们需要从非GUi类连接到GUI。我们如何连接到工具控件中的标签,或者我们如何连接到Eclipse E4中的所有GUI组件?
我们已经查看了@inject但没有取得任何成功。
答案 0 :(得分:2)
执行此操作的一种方法是使用管理器对象,该对象提供设置控件值的方法。您将管理器对象放在Eclipse上下文中,以便可以将其注入任何类(假设该类由注入系统创建)。
您可以通过多种方式在Eclipse上下文中创建管理器类,其中一种方法只是声明为:
@Creatable
@Singleton
public class MyMananger
这将导致注入系统在注入的任何地方创建所使用的类的单个实例。您还可以使用OSGi服务ContextFunction
或直接将对象设置为IEclipseContext
(可能在LifeCycle类中)。
您的工具控制代码可以注入管理器并告诉它应该更新的控件。
其他希望更新控件的代码可以注入管理器和调用方法来设置控件的值。
正如我所提到的,只有注射系统创建的代码才能使用@Inject。如果您使用new
创建一个类,则不使用注入系统。请改用ContextInjectionFactory.make
方法。
这是一个非常简单的状态行'代码改编自我使用的代码:
经理:
@Creatable
@Singleton
public final class StatusLineManager
{
/** Label control to show the status */
private Label _label;
public StatusLineManager()
{
}
void setLabel(Label label)
{
_label = label;
}
public void setText(String text)
{
if (_label != null && !_label.isDisposed())
_label.setText(text);
}
}
状态行工具控件:
public class StatusLineControl
{
public StatusLineControl()
{
}
@PostConstruct
public void postConstruct(Composite parent, StatusLineManager manager)
{
Composite body = new Composite(parent, SWT.NONE);
body.setLayout(GridLayoutFactory.fillDefaults().extendedMargins(10, 0, 4, 0).create());
Label label = new Label(body, SWT.NONE);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
// Tell the manager about the label
manager.setLabel(label);
}
}