【问题标题】:How to load data into TableView of one MPart, by selecting one child of TreeViewer from other Mpart如何通过从其他 Mpart 中选择 TreeViewer 的一个子项来将数据加载到一个 MPart 的 TableView 中
【发布时间】:2015-06-21 15:48:52
【问题描述】:

我有一个简单的要求:我的应用程序包含 2 个 MPart。一个 MPart 包含来自数据库的 TreeView 中显示的 ID 列表。通过单击任何 ID,另一个 MPart 应在 TableView 中填充/显示与所选 ID(来自 DB)相关的数据。

我编写了第一个 MPart,它在 TreeView 中显示 ID。单击捕获用户选择的 ID 并从数据库中检索与该 ID 相关的数据。使用 EPartService,我得到了第二个 MPart 的参考。但无法修改其 TableView。 (最初,我用空行填充了这个 TableView。默认)。基本上我正在尝试从 1st Mpart 修改 2nd Mpart。

我是初学者,尝试了网上所有相关的帖子。请指出正确的方向

【问题讨论】:

  • 你能告诉我们你的代码吗?

标签: java eclipse-rcp e4


【解决方案1】:

在下面的答案中,我假设您在谈论 JFace TreeViewerTableViewer。如果您在谈论 JavaFX TreeViewTableView,您将需要使用不同的方式来捕获选择事件,但 ESelectionService 的用法保持不变。

设置选择

在树的部分你可以使用依赖注入来获取ESelectionService

@Inject private ESelectionService selectionService;

然后您可以将ISelectionChangedListener 添加到TreeViewer 并将选择转发到选择服务。

ISelectionChangedListener selectionListener = new ISelectionChangedListener() {
    @Override
    public void selectionChanged(SelectionChangedEvent event) {
        IStructuredSelection selection = (IStructuredSelection) event.getSelection();
        selectionService.setSelection(selection);
    }
};
treeView.addSelectionChangedListener(selectionListener);

除了将IStructuredSelection 推送到上下文之外,您还可以直接使用您的ID,即使用selection.getFirstElement()

观察选择

在表格显示详细信息的部分中,您可以注入当前选择。每次选择更改时都会调用此方法。

@Inject
public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional Object selection) {
    // process the selection
}

注意这里使用@Optional。这将确保在活动选择为null 时也调用该方法。

更多信息

更多关于ESelectionService的信息请参考本教程: http://eclipsesource.com/blogs/tutorials/eclipse-4-e4-tutorial-part-7-services/

【讨论】:

  • 感谢 Christoph,解决方案完全符合我的要求。我可以根据 TreeView 中的 ID 选择来更新 TableView。但是在 MPart 中看不到更新的 TableView 数据,似乎 MPart/TableView 没有刷新。有什么指点吗?
  • 我不明白你的意思。您可以“更新 TableView”但“MPart/TableView 不刷新”?请编辑问题并向我们展示您的代码。
【解决方案2】:

当您拥有表格视图的MPart 时,您可以调用getObject() 来获取您的视图类:

MPart tableViewPart = ....

MyTableView view = (MyTableView)tableViewPart.getObject();

// TODO call some method of MyTableView to set the table

MyTableView 是您在 Application.e4xmi 中为视图部分定义的类。

注意:如果该部分尚未显示,则该对象将为空。使用EPartService.showPart 显示部件并创建对象。

【讨论】:

  • 谢谢 Greg,我早先试过了,但没用。请找到我的代码,似乎我犯了一些愚蠢的错误。
  • 谢谢 Greg,我早先试过了,但没用。请找到我的代码,似乎我犯了一些愚蠢的错误。 MPart vp = partService.findPart("vp"); // 在这里获取参考 InfoPart ip = (InfoPart)vp.getObject(); // vp.getObject();返回 null TableViewer tv = ip.getViewer(); tv.setInput(mi);
  • 如果部件尚未显示,则该对象尚未创建 - 使用 EPartService.showPart 显示部件并创建对象。
  • 加载时(第一次)InfoPart 加载了带有空格的 TableView。然后允许用户在 TreeView 中选择 ID 以从 ID 详细信息中呈现 TableView。在构建空白空间 TableView 后,我尝试调用 EPartService.showPart(vp, PartState.ACTIVATE)。还尝试在 InfoPart ip = (InfoPart)vp.getObject(); 之前放置相同的语句;
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 2011-08-17
  • 2014-02-12
  • 2012-01-24
  • 2021-05-13
  • 2013-02-05
  • 2020-10-21
  • 1970-01-01
相关资源
最近更新 更多