如何通过操作访问自定义 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
的方法。这应该对很多人有帮助。
- 确保您的自定义
MyToolWindow
扩展了 class SimpleToolWindowPanel
。
- 在您的自定义
myToolWindowFactory
class 中,将您的自定义 MyToolWindow
作为第一个参数传递给 ContentFactory.createContent()
。不像在官方 IntelliJ 文档中给出的 ToolWindow 示例中所做的那样,MyToolWindow
中没有 JPanel 之一...
- 在您的
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;
}
我已经在 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
的方法。这应该对很多人有帮助。
- 确保您的自定义
MyToolWindow
扩展了 classSimpleToolWindowPanel
。 - 在您的自定义
myToolWindowFactory
class 中,将您的自定义MyToolWindow
作为第一个参数传递给ContentFactory.createContent()
。不像在官方 IntelliJ 文档中给出的 ToolWindow 示例中所做的那样,MyToolWindow
中没有 JPanel 之一... - 在您的
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;
}