先后查了很多资料,问了好几个AI,想要实现装订线上的gutter,都是回答说使用LineMarkerProvider
,然后根据教程实现后发现根本就不起作用,具体原因还没找到,后续后时间再慢慢找。
今天突然发现了一个新的实现方法,因为我发现RangeHighlighter
有个方法名很像我要的功能:
/**
* Sets the renderer used for drawing gutter icons in the area covered by the
* highlighter. Gutter icons are drawn to the left of the folding area and can be used,
* for example, to mark implemented or overridden methods.
*
* @param renderer the renderer instance, or {@code null} if the highlighter does not add any gutter icons.
*/
void setGutterIconRenderer(@Nullable GutterIconRenderer renderer);
我就是需要一个带图标的gutter,这个名字怎么看怎么像。上一篇关于在代码下方添加波浪线文章中我们知道RangeHighlighter
是通过MarkupModel
获取的,整个链路类似如下:
RangeHighlighter rangeHighlighter = editor.getMarkupModel().addLineHighlighter(0, HighlighterLayer.SELECTION, null);
接下来就是实现一个GutterIconRenderer
了,大致代码如下:
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.editor.markup.GutterIconRenderer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
public class MyGutterIconRenderer extends GutterIconRenderer {
private int line;
@Override
public boolean equals(Object obj) {
if (obj instanceof MyGutterIconRenderer) {
return line == ((MyGutterIconRenderer)obj).line;
}
return false;
}
@Override
public int hashCode() {
return line;
}
@Override
public @NotNull Icon getIcon() {
return state()? icon1: icon2;
}
private boolean state(){
// do something here
return false;
}
@Override
public @Nullable AnAction getClickAction() {
// 响应icon的点击事件,该方法默认实现为null
return super.getClickAction();
}
}
最后在需要的地方调用文章开头的方法即可!!!
该方法简单有效,且非常灵活。