2016-03-25 5 views
0

私はEclipse RCPを初めて使用しており、アプリケーション(Eclipse 4)に取り組んでいます。複数の部分があり、異なるソースからデータを表示しています。ユーザーが望むデータソースを動的に選択するためのダイアログを表示するメニューを追加したいと思います。オプションが選択されると、パラメータとしてオプションを使用してパーツのクラスを再インスタンス化し、ビューを更新したいと思います。それは可能ですか?メニューハンドラからパーツクラスを再インスタンス化する方法は?

私のパートの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配列の値が、ときに、ユーザーの検証を変更メニューのオプションユーザーがオプションを検証するとき、新しいオプションでクラスのクラスを呼び出す必要があります。

これを行う方法はありますか?ありがとうございます

答えて

1

これを行うには、作成する部品のIEclipseContextの値を取得する必要があります。これを行う1つの方法は、UIEvents.Context.TOPIC_CONTEXTイベントを購読し、そのイベントで新しいパートのコンテキストを変更することです。

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

ご回答いただきありがとうございます。コンテキストハンドライベントを各パートに追加する必要があります。質問は、どのようにして、そのアイテムのクラスをメニューアイテムハンドラから呼び出すかです。パートのクラスが他のクラスから拡張されていないことを知ってインスタンス化する方法。パートはApplication.e4xmiファイルのウィザードから作成され、クラスURIとしてJavaクラスにリンクされました –

+0

いいえ、 RCP全体についてこれは、パーツを作成するために使用しているものすべてで設定します。 –

+0

私はApplication.e4xmiファイルから部品を作成しました。コンテキストを変更し、メニュー項目をクリックしたときにその部分のコンテンツをリフレッシュする方法は明確ではありません –

0

代わりに再び全体を再作成するのではなく、再作成のリフレッシュするために容易になります:あなたは@Namedを使用するので、私はここにオプションの名前を使用してい

@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 ....); 
} 

部品自体の内部のコンテンツ。これは、パーツのコンテンツを破棄し、そのコンテナの下で再度コンテンツを再作成するか、テーブル/テーブルビューアのリフレッシュメカニズムによって可能になります。

関連する問題