我们使用 Eclipse E4 构建了一个 GUI。现在我们需要从非 GUI 类连接到 GUI。我们如何连接到工具控件中的标签或如何连接到 Eclipse E4 中的所有 GUI 组件?
我们已经研究过@inject,但没有成功。
最佳答案
实现此目的的一种方法是使用管理器对象,该对象提供设置控件值的方法。您将管理器对象放入 Eclipse 上下文中,以便可以将其注入(inject)到任何类中(前提是该类是由注入(inject)系统创建的)。
您可以通过多种方式在 Eclipse 上下文中创建管理器类,其中一种只需声明为:
@Creatable
@Singleton
public class MyMananger
这将导致注入(inject)系统创建在注入(inject)的任何地方使用的类的单个实例。您还可以使用 OSGi 服务、ContextFunction
或直接将对象设置到 IEclipseContext
(可能在 LifeCycle 类中)。
您的工具控制代码可以注入(inject)管理器并告诉它应该更新的控件。
希望更新控件的其他代码可以注入(inject)管理器并调用方法来设置控件的值。
正如我提到的,只有由注入(inject)系统创建的代码才能使用@Inject。如果您使用 new
创建类,则您没有使用注入(inject)系统。请改用 ContextInjectionFactory.make 方法。
这是一个非常简单的“状态行”代码,改编 self 使用的代码:
经理:
@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);
}
}
关于java - 获取Eclipse E4的GUI组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39102133/