3

RCP アプリケーションで、新しいウィンドウをプログラムで定義して開くにはどうすればよいですか? 複数のウィンドウを開きたい - 各ウィンドウには異なるデータが表示されます。ウィンドウごとに異なる入力を設定するにはどうすればよいですか?

Eclipse IDE (ウィンドウ --> 新しいウィンドウ) の同じ機能をシミュレートしたいのですが、新しく開いたウィンドウごとに異なる入力が必要です。私は使用しようとしています: IWorkbenchPage newPage = window.openPage(inputObject); ウィンドウに表示されるデータを識別する「inputObject」をプログラムで定義するにはどうすればよいですか?

4

6 に答える 6

4

Eclipse 用語でのワークベンチ ウィンドウは、通常、メニュー、ツールバー、エディター領域、およびビューを含むウィンドウです。通常、Eclipse RCP アプリケーションには単一のウィンドウが含まれますが、一部のアプリケーションでは複数のウィンドウを作成できます。たとえば、Eclipse IDE では、ウィンドウ メニューから [新しいウィンドウ] を選択して、別のウィンドウを開くことができます。パースペクティブは、各ウィンドウに個別に設定できます。

複数のウィンドウは混乱を招く可能性がありますが、非常に便利な場合もあります。たとえば、ユーザーが 2 つの異なるデータソースで作業しているが、各データソースに対して複数のエディターとビューを開いている場合、2 つのウィンドウを開くと便利です。RCP アプリケーションの 2 つのインスタンスを開くと、同じ効果が得られます。ただし、それには、コードやその他のリソースの複数のコピーをロードする必要があり、データソースごとにアプリケーションを完全に初期化する必要があり、ウィンドウ間の相互通信がより困難になります。

RCP アプリケーションのユーザーが別のウィンドウを開くことができるようにするには、2 つの選択肢があります。

RCP アプリケーションに「新しいウィンドウ」メニュー項目を含めることができます。これは、ワークベンチによって提供されるアクションを RCP アプリケーションに追加することによって実行できます。ActionBarAdvisor クラスを変更します。

フィールド宣言に追加します。

private IWorkbenchAction newWindowAction;

アクションを作成するコード (通常は makeActions と呼ばれるメソッド) に追加します。

newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
register(newWindowAction);

メニューを作成するコードに追加します。

menu.add(newWindowAction);

ここで、menu は通常、ウィンドウ メニューです。アプリケーションにまだウィンドウ メニューがなく、作成したい場合は、次の行が機能します。

MenuManager menu = new MenuManager( "&Window", IWorkbenchActionConstants.M_WINDOW);

これにより、Eclipse IDE の Window->New Window メニュー項目と同じ方法で新しいウィンドウを作成するメニュー項目が表示されます。

ただし、これでは入力を制御できません。2 番目のウィンドウには、異なるビュー セットとエディターが開いている場合があり、パースペクティブ セットが異なる場合がありますが、「入力」は同じままです。たとえば、Eclipse IDE では 2 番目のウィンドウを開くことができますが、ワークスペースを切り替えると、すべてのウィンドウに適用されます。

新しいウィンドウを作成する 2 つ目の方法は、ページを作成してプログラムで作成することです。これにより、「入力」をウィンドウに設定できます。そのため、あるウィンドウでビューを開くと、同じビューを別のウィンドウで開いた場合とは異なるデータが表示される場合があります。

技術的には、ウィンドウには入力がありません。ページには入力があります。ウィンドウには、最大で 1 ページを含めることができます。一部のメソッド名から、ウィンドウが複数のページを持つことができるように見える場合があります (たとえば、getActivePage は非アクティブなページがあることを意味します)。これらのメソッド名は、複数のページがサポートされていた Eclipse 2.0 の時代からの名残です。

プログラムで新しいページを開くには:

        IWorkbenchPage newPage = window.openPage(myInput);

このメソッドは、ウィンドウにまだページが含まれていない場合、指定されたウィンドウに新しいページを作成します。それ以外の場合は、ページを含む新しいウィンドウが作成されます。

入力が異なる複数のウィンドウをサポートする場合は、各ウィンドウを区別するタイトルを各ウィンドウに設定する必要があります。

        newPage.getWorkbenchWindow().getShell().setText("My App - " + myInput.getName());

ウィンドウへの入力を変更したい場合があります。ページへの入力を変更することはできないため、既存のページを閉じて新しいページを作成する必要があります。次のコードは、既存のページを閉じます。

        IWorkbenchPage activePage = window.getActivePage();
        activePage.close();

Eclipse が提供する一部のビューは、ページ入力を使用することに注意してください。たとえば、Common Navigator ビューは、ページ入力をナビゲーション ツリーのルート要素として使用します。

独自のビューからページ入力にアクセスするには、 を呼び出しますsite.getPage().getInput()。開始するサイト コンテキストがない場合は、次を呼び出して入力を取得します。

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getInput();

「入力」はオブジェクトであることに注意してください。任意のクラスのオブジェクトにすることができます。から戻したらPage::getInput()、適切なクラスにキャストして戻します。通常、入力となる新しいクラスを作成しないでください。ほとんどの場合、既存のクラスを使用できます。これは通常、オブジェクト モデルの最上位オブジェクトです。Eclipse フレームワークは、この入力を保管し、Page::getInput()呼び出されたときに戻す以外には何もしません。

于 2009-05-20T23:19:11.913 に答える
2

Eclipse プラグイン モデルでビューを実装する方法を理解する必要があります。これは、拡張ポイントを追加してプロパティを構成するか、コードを使用して実現できます。プロパティを構成することをお勧めします。どちらも次の場所で説明されています。

http://www.vogella.de/articles/RichClientPlatform/article.html#views

そのサイトには、Eclipse 開発に関する優れた記事がたくさんあります。

http://www.vogella.de/eclipse.html

とにかく、PSU_Kardi が示唆したように、記事全体を読むことをお勧めします。

于 2009-05-14T20:08:39.930 に答える
1

他のウィンドウを本当に開きたいことを確認する必要があります。たぶん、既存のウィンドウでいくつかの新しいビューまたはエディターを開くことで同じことを達成できますか?複数のビューを使用すると、ほぼ同じように見える複数のウィンドウが表示されないため、通常、ユーザーは理解しやすくなります。また、ビュー間の関係を簡単に表示できるようになります。

そうは言ってもIWorkbench.openWorkbenchWindow、まったく新しいウィンドウを作成するために呼び出すことができます。この良い例は、 OpenNewWindowMenuにあるWindow- >NewWindowのコードです。

于 2009-05-15T17:30:02.113 に答える
1

私や他の誰かがこの質問に答えるには、「ウィンドウ」をより適切に定義する必要があると思います。

複数回開きたいプラグインを作成していますか? その場合、エディターが必要で、マニフェスト ファイルで指定できるシングルトン パターンを使用していないことを確認する必要があります。

それとも、データを表示したいウィンドウを作成しようとしていますか? ビューのような?それを行っている場合は、ViewPart の作成方法を読み、すべてを適切に拡張することを確認してください。

私のお気に入りの 2 つの RCP サイトに行くことをお勧めします

http://www.vogella.de/articles/RichClientPlatform/article.html

http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm

于 2009-05-14T16:10:57.427 に答える
1

次の Handler は、@Execute メソッドが呼び出されるたびに、互いに独立したデータ コンテンツを持つ新しい TrimmedWindow を作成します。

package com.vogella.tasks.ui.handlers;

import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.model.application.ui.basic.impl.TrimmedWindowImpl;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;

import com.vogella.tasks.ui.parts.DynamicPart;

public class OpenAdditionalWindowHandler {
    private static final String PART_DESCRIPTOR_ID = "com.vogella.tasks.ui.partdescriptor.static.part";
    static int posX = 20;
    static int posY = 20;
    static int counter = 0;

    /**
     * Opens a new TrimmedWindow based on the (template) definition. Each time invoked a separate window is opened with independent data content.
     */
    @Execute
    public void execute(EPartService partService, MWindow window, MApplication application, EModelService modelService) throws WorkbenchException {

        // Get the predefined TrimmedWindow and clone it
        MUIElement element = modelService.find("com.vogella.tasks.ui.trimmedwindow.zusatz", application);
        TrimmedWindowImpl clonedWindow = (TrimmedWindowImpl) modelService.cloneElement(element, application);
        application.getChildren().add(clonedWindow);
        modelService.bringToTop(clonedWindow);
        clonedWindow.setToBeRendered(true);

        // Shift the new windows a little bit each time a new one is created
        shiftWindowPositionSoTheyDontExactlyOverlay(clonedWindow);

        // Derive new Part Descriptor Id with counter & create new part
        final String dynamicallyCreatedPartId = PART_DESCRIPTOR_ID + counter++;
        MPart dynamicallyCreatedPart = partService.createPart(PART_DESCRIPTOR_ID);

        if (dynamicallyCreatedPart != null) {
            // Add the part to the newly cloned trimmed window
            clonedWindow.getChildren().add(dynamicallyCreatedPart);

            dynamicallyCreatedPart.setElementId(dynamicallyCreatedPartId);
            dynamicallyCreatedPart.setLabel("My part nbr " + counter);

            final DynamicPart staticPseudoAspect = (DynamicPart) dynamicallyCreatedPart.getObject();
            staticPseudoAspect.setContent("Dynamic part content nbr " + counter);
            clonedWindow.getChildren().get(0).setVisible(true);
            clonedWindow.getChildren().get(0).setToBeRendered(true);

        }

    }

    private void shiftWindowPositionSoTheyDontExactlyOverlay(TrimmedWindowImpl clonedWindow) {
        posX = posX + 20;
        posY = posY + 20;
        clonedWindow.setX(posX);
        clonedWindow.setY(posY);
    }

}

トリミングされたウィンドウは、アプリケーション モデルでテンプレートとして定義されます。アプリケーションモデルに PartDescriptor という形で記述されている Part も同様です。

ここに画像の説明を入力

于 2020-07-24T17:56:36.290 に答える
0

これにより、メイン アプリケーション ウィンドウの横に新しいウィンドウが開きます。

package any.pack;

import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.model.application.ui.basic.impl.PartImpl;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.swt.SWT;

public class WindowOpener {

    private MWindow createWindow(EModelService modelService, MApplication application) {
        MWindow window = modelService.createModelElement(MTrimmedWindow.class);
        window.setElementId("com.ubs.cqe.ui.window.aside.1");
        window.setLabel("Second Window");
        window.getPersistedState().put(IPresentationEngine.STYLE_OVERRIDE_KEY, "" + SWT.SHELL_TRIM);
        window.setVisible(true);
        window.setX(20);
        window.setY(20);
        window.setWidget(700);
        window.setHeight(500);
        application.getChildren().add(window); // Add window to application
        return window;
    }
    
}
于 2020-07-24T18:02:21.393 に答える