我很难理解LayeredHighlighter。我有两个亮点。 一个我在创建textarea区域时突出显示文本。另一个荧光笔是滚动文本时的亮点。
我遇到的问题是我使用鼠标时突出显示的内容与创建textarea时设置的文本上的突出显示不重叠。
以下是创建textarea时突出显示的文本
当我使用鼠标突出显示整个文本时,它不会显示在顶部
我想我需要使用LayeredHighlighter。我尝试使用painter.paintLayer(...)
使用它,当我创建灰色突出显示时,我使用了它。
无论如何都要将我的灰色高光设置在背面,这样当我选择整条线时,我的鼠标蓝色高光会显示在它上面吗?所以整行应该是蓝色的
谢谢:)
答案 0 :(得分:3)
从未使用J/XLayer
,但还有另一种绘画方式JViewport或Glass/RootPane,理论上它可以创建3_layer绘画
修改
使用J/XLayer
是否还有另一个问题需要模拟MouseEvent
,例如this way
答案 1 :(得分:2)
在Core Swing book, page 262中,有一些关于语义的文档(与API参考不同)。它似乎归结为只有两层的系统。除了使用{em>不 <{1}}的{{1}}(有点反直觉的设计模式)之外,对z顺序没有太多控制,而使用的是。突出显示第一种类型的画家将首先(以任意顺序)。然后是所有Highlighter.HighlightPainter
。也是以任意顺序,但我们可以猜测选择突出显示首先被绘制(它使用LayeredHighlighter.LayerPainter
),然后是顶部的其他LayerPainter
突出显示。
因此,解决方案(适用于我)是使用LayerPainter
添加突出显示。确保不 LayerPainter
;即可能使用直接从Highlighter.HighlightPainter
派生的匿名类。不要使用LayeredHighlighter.LayerPainter
,因为它是Highlighter.HighlightPainter
的子类。但也许您的DefaultHighlighter.DefaultHighlightPainter
实现可以保持对LayeredHighlighter.LayerPainter
的实例的引用,并向其发送Highlighter.HighlightPainter
请求 - 从而避免必须从头开始编写绘制代码。这将解决所示的问题,因为每当重新绘制视图的一部分时,此DefaultHighlighter.DefaultHighlightPainter
- 不 - paint(..)
将在选择HighlightPainter
之前填充其背景部分 - 是 - LayerPainter
。 (请注意,HighlightPainter
使用的是什么LayerPainter
并不重要,只考虑特定突出显示的Highlighter
。
(现在,在我的情况下,我也有兴趣通过选择亮点显示基础亮点。我通过使用半透明选择颜色Layered
来做到这一点。)
答案 2 :(得分:1)
@Evgeni的回答是正确的。花了一些时间才找到关于如何同时为我的JEditorPane渲染精彩集锦和精选的帖子。
final Highlighter highlighter = new DefaultHighlighter();
editorPane.setHighlighter(highlighter);
editorPane.setSelectionColor(new Color(80, 120, 255, 100));
final HighlightPainter matchPainter = new Highlighter.HighlightPainter() {
final DefaultHighlightPainter helper = newDefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
@Override
public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c)
{
helper.paint(g, p0, p1, bounds, c);
}
};
highlighter.addHighlight(iIndexToTradeId, iIndexToTradeId+sTradeId.length(), matchPainter);
答案 3 :(得分:0)
我的帽子是给@Evgeni Sergeev,因为我很好地利用了HighlightPainter
在 LayerPainter
下绘制的观察结果,如下所示:
参考此图片Black Bar at the top of a Brown Box, with a Blue Box to the right of the Brown Box,棕色框顶部的黑线由以下方式绘制:
class LineHighlightPainter extends DefaultHighlightPainter
这为我提供了一个免费的LayerPainter实现,它只是一个接口。
棕色和蓝色方框由以下方式绘制:
class RVMHighlightPainter implements Highlighter.HighlightPainter
我从UnderlineHighlightPainter
复制了这两个代码,我发现here。