繁体   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