今天就给大家介绍一下怎么自定义toolWindow里面的内容。如:创建一个树,可以自定义里面的内容,并且刷新树

1.前面两篇讲解了创建一个按钮,今天来将一下创建一个toolWindow并添加里面的内容

编写插件离不开plugin.xml,在插件中配置自己的toolWindow,此时自己配置的toolWindow已经打开。

<extensions defaultExtensionNs="com.intellij">
  <!-- Add your extensions here -->
  <!-- 自定义控制台输入 -->
  <!--canCloseContents 允许用户关闭-->
  <toolWindow canCloseContents="true" anchor="bottom"
              id="JDCompute Code Lines"
              factoryClass="MyBottomWin">
  </toolWindow>

</extensions>

运行toolWindow,并按下图打开,你会看到右下角有自定义的toolWindow;

windows IDEA 使用docker_自定义

windows IDEA 使用docker_Code_02

2.接下来讲一下点击打开自定义的toolWindow

{
    if (e.getProject() != null) {
        // 将项目对象,ToolWindow的id传入,获取控件对象
        ToolWindow toolWindow = ToolWindowManager.getInstance(e.getProject()).getToolWindow("JDCompute Code Lines");
        if (toolWindow != null) {
            // 无论当前状态为关闭/打开,进行强制打开ToolWindow
            toolWindow.show(new Runnable() {
                @Override
                public void run() {

                }
            });
        }
    }

}



从代码中可以看出,涉及到了单例模式以及线程,再传project的时候,小编也是猜的,不知道传什么值,看到网上的一些例子只是传入了文本数据。


这样就可以实现点击的时候打开自定义的toolWindow

3.在toolWindow上写入一棵下拉的树,并可以增加子菜单。

在配置文件中可以看到MyBottomWin这个工厂类,他实现了ToolWindowFactory接口,

@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
   // myToolWindow=toolWindow;
    ContentFactory contentFactory = ContentFactory.SERVICE.getInstance();
    Content content = contentFactory.createContent(mainPanel,"", false);
    toolWindow.getContentManager().addContent(content);
}

接口实现以后就可以在重写的方法里面定义自己的面板等。

然后初始化这个类

public MyBottomWin() {
    //定义字体
    Font fnt = new Font("Microsoft YaHei UI", Font.PLAIN, 15);
    //找到字体的资源管理
    FontUIResource fontRes = new FontUIResource(fnt);
    for (Enumeration keys = UIManager.getDefaults().keys(); keys.hasMoreElements(); ) {
        Object key = keys.nextElement();
        Object value = UIManager.get(key);
        if (value instanceof FontUIResource)
            UIManager.put(key, fontRes);
    }
    //定义tree 的根目录
    DefaultMutableTreeNode  root = new DefaultMutableTreeNode("京东集团");
    //定义根节点下面的子节点
    DefaultMutableTreeNode n1 = new DefaultMutableTreeNode("京东研发");
    DefaultMutableTreeNode n2 = new DefaultMutableTreeNode("京东行政");
    DefaultMutableTreeNode n3 = new DefaultMutableTreeNode("京东物流");
    DefaultMutableTreeNode n4 = new DefaultMutableTreeNode("京东金融");
    DefaultMutableTreeNode n5 = new DefaultMutableTreeNode("京东商城");
    DefaultMutableTreeNode n6 = new DefaultMutableTreeNode("京东财务");
    root.add(n1);
    root.add(n2);
    root.add(n3);
    root.add(n4);
    root.add(n5);
    root.add(n6);
    //构造一个treeModel 对象,进行刷新树操作
    dt = new DefaultTreeModel(root);
    tree1 = new JTree(dt);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); //得到屏幕的尺寸
    //设置主面板的大小
    mainPanel.setPreferredSize(new Dimension((int)screenSize.getWidth()-50, (int) screenSize.getHeight()/3*2));
    //tree 设置大小
    tree1.setPreferredSize(new Dimension((int)screenSize.getWidth()-50, (int) screenSize.getHeight()/3*2));
   ///构造一个 有滚动条的面板
    scrollPane = new JScrollPane();
    //设置滚动条面板位置
    scrollPane.setPreferredSize(new Dimension((int)screenSize.getWidth()-50, (int) screenSize.getHeight()/3*2-50));
    //将tree添加道滚动条面板上
    scrollPane.setViewportView(tree1);
    //将滚动条面板设置哼可见
    scrollPane.setVisible(true);
    //设置滚动条的滚动速度
    scrollPane.getVerticalScrollBar().setUnitIncrement(15);
    //解决闪烁问题
    scrollPane.getVerticalScrollBar().setDoubleBuffered(true);
    mainPanel=new JPanel();
    mainPanel.add(scrollPane);
    tree1.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == e.BUTTON3) { //BUTTON3是鼠标右键
                //获取点击的tree节点
                DefaultMutableTreeNode note = (DefaultMutableTreeNode) tree1.getLastSelectedPathComponent();
                if(note!=null) {
                    addTreeChilden(note);
                }
            }
        }
    });
}

运行的效果

windows IDEA 使用docker_idea插件自定义toolWindow_03

好了,插件的介绍到此为止,有缘再写。