如何从菜单处理程序重新实例化零件类?

时间:2016-03-25 20:40:03

标签: java eclipse eclipse-plugin eclipse-rcp rcp

我是Eclipse RCP的新手,我正在开发一个应用程序(Eclipse 4),我有多个部分来展示来自不同来源的数据。我想添加一个菜单,显示一个Dialog,可以动态选择用户想要的数据源。选择选项后,我想使用选项作为参数重新实例化Part的类并刷新视图。这可能吗?

我的Part的createComposite方法:

    @PostConstruct
    public void createComposite(Composite parent) {
        Composite composite = new Composite(parent, SWT.EMBEDDED);
        parent_C = parent;
        Frame frame_1 = SWT_AWT.new_Frame(composite);
        JPanel mainPanel = new JPanel();
        BorderLayout layout = new BorderLayout();
        mainPanel.setLayout(layout);

          /* Layout Definition */
     }

我想在createComposite方法中添加另一个参数来指示选项:

@PostConstruct
    public void createComposite(Composite parent, String[] options) {
    /*Code Here*/
}

当用户从菜单验证选项时,String数组的值会更改。当用户验证他的选项时,应该使用新选项调用该部分的类。

有没有办法做到这一点?谢谢

2 个答案:

答案 0 :(得分:1)

要执行此操作,您需要获取正在创建的零件的IEclipseContext中的值。一种方法是订阅UIEvents.Context.TOPIC_CONTEXT事件并在该事件中修改新部分的上下文。

@Inject
IEventBroker eventBroker;


eventBroker.subscribe(UIEvents.Context.TOPIC_CONTEXT, this::handleContextEvent);


private void handleContextEvent(Event event)
{
  Object origin = event.getProperty(UIEvents.EventTags.ELEMENT);
  if (!(origin instanceof MPart))
    return;

  MPart part = (MPart)origin;

  // TODO check this is the MPart you want

  Object context = event.getProperty(UIEvents.EventTags.NEW_VALUE);
  if (!(context instanceof IEclipseContext))
    return;

  IEclipseContext newContext = (IEclipseContext)context;

  newContext.set("nameForOptions", .... options ....);
}

我在这里使用了一个名称,因此您可以使用@Named

@PostConstruct
public void createComposite(Composite parent, @Named("nameForOptions") String[] options)

答案 1 :(得分:0)

不再重新创建整个部件,而是更容易刷新部件内部的内容。这应该可以通过处理部件的内容并在该容器下再次重新创建内容,或者通过任何表/表查看器的刷新机制来实现。