如何通过操作访问自定义 ToolWindow 内的组件?

How to access components inside a custom ToolWindow from an action?

我已经在 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 构建方式中最实用的方法吗?我不能以不同的方式访问这些组件吗?

我找到了访问自定义 myToolWindow 的方法。这应该对很多人有帮助。

  1. 确保您的自定义 MyToolWindow 扩展了 class SimpleToolWindowPanel
  2. 在您的自定义 myToolWindowFactory class 中,将您的自定义 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;
}