JTextArea中鼠标选中区域覆盖高亮文本时不显示,如何实现选择层置顶?
解决JTextArea选中效果被自定义高亮覆盖的问题
这个问题我之前也碰到过!核心原因是DefaultHighlighter里不同高亮的绘制层级顺序:默认情况下我们添加的自定义高亮和文本选中高亮的层级关系,导致自定义高亮盖在了选中效果上面。
快速解决方案:指定自定义高亮的层级为背景层
DefaultHighlighter内置了几个层级常量,其中:
LAYER_BACKGROUND(值为0):最底层,用于背景类高亮LAYER_SYNTAX(值为1):默认的自定义高亮层级LAYER_SELECTION(值为2):最上层,文本选中的高亮就在这个层级
我们只需要在添加自定义高亮时,指定它的层级为LAYER_BACKGROUND,这样选中高亮(层级更高)就会自动显示在上面了。修改你的代码如下:
// 替换原来的addHighlight调用 inputTextArea.getHighlighter().addHighlight( start, end, DefaultHighlighter.LAYER_BACKGROUND, new DefaultHighlighter.DefaultHighlightPainter(new Color(color)), null );
原理说明
DefaultHighlighter会按照层级数值从小到大的顺序绘制高亮:数值越小,绘制越早(也就越靠下)。把自定义高亮放在LAYER_BACKGROUND,选中高亮在LAYER_SELECTION(数值更大),所以选中效果会覆盖在自定义高亮之上,完美解决你说的“选中部分高亮文本看不到选中状态”的问题。
额外技巧:调整已添加高亮的层级
如果你已经添加了高亮,不想重新添加,可以用setLayer方法调整它的层级:
// 先保存添加高亮时返回的tag对象 Object highlightTag = inputTextArea.getHighlighter().addHighlight(start, end, new DefaultHighlighter.DefaultHighlightPainter(new Color(color))); // 调整层级为背景层 inputTextArea.getHighlighter().setLayer(highlightTag, DefaultHighlighter.LAYER_BACKGROUND);
这样也能达到同样的效果。
内容的提问来源于stack exchange,提问作者Nulleye
相关产品推荐
相关产品推荐

