簡體   English   中英

Eclipse RCP應用程序-以編程方式創建一個窗口

[英]Eclipse RCP application - Create a window programmatically

在RCP應用程序中,如何以編程方式定義和打開新窗口? 我想打開幾個窗口-每個窗口顯示不同的數據。 如何為每個窗口設置不同的輸入?

我想模擬Eclipse IDE的相同功能(“窗口->新建窗口”),但是我希望每個新打開的窗口都具有不同的輸入。 我正在嘗試使用:IWorkbenchPage newPage = window.openPage(inputObject); 如何以編程方式定義用於標識窗口中顯示的數據的“ inputObject”?

Eclipse術語中的工作台窗口是通常包含菜單,工具欄,編輯器區域和視圖的窗口。 Eclipse RCP應用程序通常包含一個窗口,但是某些應用程序允許創建多個窗口。 例如,在Eclipse IDE中,可以通過從窗口菜單中選擇“新建窗口”來打開另一個窗口。 可以在每個窗口中獨立設置透視圖。

盡管多個窗口可能令人困惑,但它們也非常有用。 例如,如果用戶可能正在使用兩個不同的數據源,但是針對每個數據源打開了多個編輯器和視圖,則打開兩個窗口將很有用。 通過打開RCP應用程序的兩個實例可以實現相同的效果。 但是,這將需要加載代碼和其他資源的多個副本,將需要為每個數據源完全初始化應用程序,這將使窗口之間的交叉通信更加困難。

要允許RCP應用程序的用戶打開另一個窗口,您有兩種選擇。

您可以在RCP應用程序中包括“新窗口”菜單項。 這可以通過將工作台提供的操作添加到RCP應用程序來完成。 修改您的ActionBarAdvisor類:

添加到字段聲明中:

private IWorkbenchAction newWindowAction;

將代碼添加到您在其中執行操作的位置(通常稱為makeActions的方法):

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

將代碼添加到創建菜單的位置:

menu.add(newWindowAction);

其中菜單通常是“窗口”菜單。 如果您的應用程序中還沒有Window菜單,並且想創建一個Window菜單,那么以下行將起作用:

MenuManager菜單=新的MenuManager(“&Window”,IWorkbenchActionConstants.M_WINDOW);

這將為您提供一個菜單項,該菜單項將以與Eclipse IDE中的Window-> New Window菜單項相同的方式創建一個新窗口。

但是,這無法控制輸入。 第二個窗口可能具有不同的視圖集並打開了編輯器,並且可能具有不同的透視圖集,但是它仍將具有相同的“輸入”。 例如,在Eclipse IDE中,您可以打開第二個窗口,但是如果您切換工作區,則該窗口將應用於所有窗口。

創建新窗口的第二種方法是通過創建頁面以編程方式進行。 這使您可以為窗口設置“輸入”。 因此,與在另一窗口中打開同一視圖相比,在一個窗口中打開視圖可能會導致顯示不同的數據。

從技術上講,窗口沒有輸入。 頁面已輸入。 一個窗口最多可以包含一頁。 從某些方法名稱看來,一個窗口可以具有多個頁面(例如,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()時將其傳遞回。

您需要了解如何在Eclipse插件模型中實現視圖。 這可以通過添加擴展點和配置屬性或通過代碼來實現。 配置屬性是首選方法。 兩者的解釋如下:

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

該站點上有很多關於Eclipse開發的好文章:

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

無論如何,正如PSU_Kardi所建議的那樣,通讀整篇文章是一個好主意。

我認為您需要為我或其他人更好地定義一個“窗口”以回答這個問題。

您是否要創建一個要多次打開的插件,在這種情況下,您可能需要編輯器並需要確保未使用Singleton模式-您可以在清單文件中指定該模式。

還是要創建一個要顯示數據的窗口? 喜歡一個風景嗎? 如果要這樣做,則需要閱讀有關如何創建ViewPart的內容,並確保正確擴展了所有內容。

可能我建議去我最喜歡的兩個RCP網站

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

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

您應該確保確實要打開其他窗口。 也許您可以通過在現有窗口中打開一些新視圖或編輯器來實現相同的目的? 使用多個視圖通常使用戶更容易理解,因為它們沒有顯示看起來幾乎相同的幾個窗口。 這也使您更容易顯示視圖之間的關系。

話雖如此,您可以調用IWorkbench.openWorkbenchWindow來創建一個全新的Window。 一個很好的例子是OpenNewWindowMenu中的Window- > New Window的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM