idea插件开发(6)-toolWindows

工具窗口指IDEA的子窗口,这些窗口通常沿着主窗口的外边缘有自己的工具栏,包含一个或多个工具窗口按钮,这些按钮激活显示在主 IDE 窗口左侧、底部和右侧的面板。每侧包含两个工具窗口组,主要组和次要组,并且每次只能激活每个组中的一个工具窗口。如图所示:

一、涉及的扩展

    ToolWindowFactory:工具窗口的扩展类 DumbAware:如果工具窗口的内容需要索引,则要实现此接口; ToolWindowManagerListener:允许监听工具窗口(取消)注册/显示事件

二、plugin.xml配置

<extensions defaultExtensionNs="com.intellij">
        <toolWindow id="Sample Calendar"
                    secondary="true" 
                    icon="AllIcons.Toolwindows.WebToolWindow"
                    anchor="right"
                    factoryClass="com.zd.ui.CalendarToolWindowFactory"/>
    </extensions>
    id:对应于工具窗口按钮上显示的文本,可用绑定资源包; icon:工具窗口按钮上显示的图标,可以使用平台内置的图标,工具类为com.intellij.icons.AllIcons.java,具体的.svg文件存放在app.jar包下的icons文件夹中; secondary:工具窗口显示在主组还是次组; anchor:工具窗口的位置,“左”(默认)、也可以设置“右”或“底”; factoryClass:自定义的实现类

三、示例Java实现

需要注意代码中被注释的内容,也可以通过另一种方式来添加,如果必要的话还可以通过content.dispose()来释放资源。

public class CalendarToolWindowFactory implements ToolWindowFactory, DumbAware {

    @Override
    public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
        CalendarToolWindowContent toolWindowContent = new CalendarToolWindowContent(toolWindow);
        Content content = ContentFactory.getInstance().createContent(toolWindowContent.getContentPanel(), "", false);
        toolWindow.getContentManager().addContent(content);

        //ToolWindow.getContentManager().addContent(content);
        //content.dispose();
    }

    @Data
    private static class CalendarToolWindowContent {

        private final JPanel contentPanel = new JPanel();

        public CalendarToolWindowContent(ToolWindow toolWindow) {
            contentPanel.setLayout(new FlowLayout());
            contentPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

            JLabel currentDate = new JLabel();
            final String CALENDAR_ICON_PATH = "/ui/toolWindow/Calendar-icon.png";
            currentDate.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource(CALENDAR_ICON_PATH))));
            contentPanel.add(currentDate);
            contentPanel.add(createControlsPanel(toolWindow));
        }

        @NotNull
        private JButton createControlsPanel(ToolWindow toolWindow) {
            JButton hideToolWindowButton = new JButton("Hide");
            hideToolWindowButton.setSize(120, 50);
            hideToolWindowButton.addActionListener(e -> toolWindow.hide(null));
            return hideToolWindowButton;
        }
    }
}

四、插件效果

可从菜单栏 View-Tool window- Sample Calendar打开插件。

经验分享 程序员 微信小程序 职场和发展