微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我已在 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 扩展了类 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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。