如何从动作访问自定义 ToolWindow 内的组件?

时间:2021-03-09 14:35:52

标签: intellij-idea plugins intellij-plugin

我已在 EditorPopupMenu(这是右键单击菜单)中注册了一个操作。我在 ToolWindow(我使用 GUI Designer 插件设计的)中还有一堆组件,我想更新它们的值。

IntelliJ 论坛上有一些关于此的帖子,典型的答案似乎是建议使用 ToolWindow 的 ContentManager,并获取包含所有组件的 JPanel。例如。以下内容:

    Project p = e.getProject();

    ToolWindow toolWindow;
    toolWindow = ToolWindowManager.getInstance(p).getToolWindow("My ToolWindow ID");

    ContentManager contentManager = toolWindow.getContentManager();

    JPanel jp = (JPanel) contentManager.getContent(0).getComponent();

这感觉违反直觉...必须在 JPanel 内部导航才能找到一堆组件。如果我决定将我的组件放在不同的容器中怎么办?突然间,我导航到我的组件的方式会崩溃。

这真的是约束自己的 GUI 构建方式的最实用方法吗?我不能以不同的方式访问这些组件吗?

1 个答案:

答案 0 :(得分:0)

我找到了一种访问我的自定义 myToolWindow 的方法。这应该可以帮助很多人。

  1. 确保您的自定义 MyToolWindow 扩展了类 SimpleToolWindowPanel
  2. 在您的自定义 myToolWindowFactory 类中,将您的自定义 MyToolWindow 作为第一个参数传递给 ContentFactory.createContent()。不是在官方 IntelliJ 文档中给出的 ToolWindow 示例中所做的 MyToolWindow 内部的 JPanel 之一...
  3. 在您的 MyToolWindow 构造函数中,调用方法 setContent(<YourJPanelContainingYourComponents>)。

我通过对来自 this link 的示例 5 进行实验找到了答案:

public JBTabbedTerminalWidget getTerminalWidget(ToolWindow window) {
    window.show(null);
    if (myTerminalWidget == null) {
        JComponent parentPanel = window.getContentManager().getContents()[0].getComponent();
        if (parentPanel instanceof SimpleToolWindowPanel) {
            SimpleToolWindowPanel panel = (SimpleToolWindowPanel) parentPanel;
            JPanel jPanel = (JPanel) panel.getComponents()[0];
            myTerminalWidget = (JBTabbedTerminalWidget) jPanel.getComponents()[0];
        } else {
            NotificationUtils.infoNotification("Wait for Freeline to initialize");
        }
    }
    return myTerminalWidget;
}