Java 如何使用LayeredHighlighter-一个突出显示在另一个突出显示之上

Java 如何使用LayeredHighlighter-一个突出显示在另一个突出显示之上,java,swing,Java,Swing,我正在努力理解分层荧光灯。我有两个亮点。 一个是在创建textarea时高亮显示文本。另一个高亮显示是滚动文本时得到的高亮显示 我遇到的问题是,我用鼠标高亮显示的文本与创建textarea时设置的文本高亮显示不重叠 下面是创建textarea时高亮显示的文本 当我使用鼠标突出显示整个文本时,它不会显示在顶部 我想我需要使用分层荧光灯。我试图通过使用painter.paintLayer(…)来使用它,我在创建灰色高亮时使用了它 是否可以将我的灰色高光设置在后面,这样当我选择整条线时,我的鼠标蓝

我正在努力理解分层荧光灯。我有两个亮点。 一个是在创建textarea时高亮显示文本。另一个高亮显示是滚动文本时得到的高亮显示

我遇到的问题是,我用鼠标高亮显示的文本与创建textarea时设置的文本高亮显示不重叠

下面是创建textarea时高亮显示的文本

当我使用鼠标突出显示整个文本时,它不会显示在顶部

我想我需要使用分层荧光灯。我试图通过使用painter.paintLayer(…)来使用它,我在创建灰色高亮时使用了它

是否可以将我的灰色高光设置在后面,这样当我选择整条线时,我的鼠标蓝色高光将位于其上方?所以整条线应该是蓝色的


谢谢:)

从未使用过
J/XLayer
,但有另一种方法可以在or上进行绘制,理论上可以创建3层绘制

编辑


通过使用
J/XLayer
是否还有另一个问题需要您模拟
MouseEvent
,例如从未使用过
J/XLayer
,但是有另一种方法可以绘制or,那么理论上它可以创建3层绘制

编辑

通过使用
J/XLayer
是否还有另一个问题需要您模拟
MouseEvent
例如,在中,有一些关于语义的文档(与API参考中不同)。它似乎可以归结为一个只有两层的系统。除了使用不是
LayeredHighlighter.LayerPainter的
HighlightPainter
(有点违反直觉的设计模式)的荧光笔.HighlightPainter
与使用非荧光笔的荧光笔.LayerPainter相比,对z顺序没有太多的控制。突出显示第一种类型的画家将首先开始(以任意顺序)。然后所有的
layerPaint
s。也可以按任意顺序绘制,但我们可以猜测,选择高光首先绘制(它使用一个
LayerPainter
),然后在顶部绘制其他
LayerPainter
高光

因此,解决方案(对我来说是有效的)是使用
Highlighter.HighlightPainter
添加高光。确保它不是一个
分层荧光灯。分层油漆器
;i、 e.可能使用直接从
Highlighter.HighlightPainter
派生的匿名类。不要使用
DefaultHighlighter.DefaultHighlightPainter
,因为它是
LayeredHighlighter.LayerPainter
的子类。但是,您的
Highlighter.HighlightPainter
实现可能会保留对
DefaultHighlighter.DefaultHighlightPainter
实例的引用,并将
paint(…)
请求转发给它,从而避免从头开始编写绘制代码。这将解决所示的问题,因为每当重新绘制视图的一部分时,此
HighlightPainter
-非-
LayerPainter
将在选择的
HighlightPainter
-是-
LayerPainter
之前填充其背景部分。(请注意,无论使用了什么
高亮灯
分层
与否,只有特定高亮显示的
高亮画家
。)

(现在,在我的例子中,我也对通过选择高亮显示底层高亮感兴趣。我使用半透明的选择颜色:
jtextpane.setSelectionColor(Color(80120255100))

在中,有一些关于语义的文档(与API参考中不同)。它似乎可以归结为一个只有两层的系统。除了使用不是
LayeredHighlighter.LayerPainter的
HighlightPainter
(有点违反直觉的设计模式)的荧光笔.HighlightPainter
与使用非荧光笔的荧光笔.LayerPainter
相比,对z顺序没有太多的控制。突出显示第一种类型的画家将首先开始(以任意顺序)。然后所有的
layerPaint
s。也可以按任意顺序绘制,但我们可以猜测,选择高光首先绘制(它使用一个
LayerPainter
),然后在顶部绘制其他
LayerPainter
高光

因此,解决方案(对我来说是有效的)是使用
Highlighter.HighlightPainter
添加高光。确保它不是一个
分层荧光灯。分层油漆器
;i、 e.可能使用直接从
Highlighter.HighlightPainter
派生的匿名类。不要使用
DefaultHighlighter.DefaultHighlightPainter
,因为它是
LayeredHighlighter.LayerPainter
的子类。但是,您的
Highlighter.HighlightPainter
实现可能会保留对
DefaultHighlighter.DefaultHighlightPainter
实例的引用,并将
paint(…)
请求转发给它,从而避免从头开始编写绘制代码。这将解决所示的问题,因为每当重新绘制视图的一部分时,此
HighlightPainter
-非-
LayerPainter
将在选择的
HighlightPainter
-是-
LayerPainter
之前填充其背景部分。(请注意,无论使用了什么
高亮灯
分层
与否,只有特定高亮显示的
高亮画家
。)


(现在,在我的例子中,我也对通过选择高光显示底层高光感兴趣。我使用半透明的选择颜色:
jtextpane.setSelectionColor(颜色(80、120、255、100))
,我的帽子掉到@Evgeni Sergeev,我很好地利用了他的观察,
HighlightPainter
LayerPainter
下绘制,如下所示:

参照这张图片,黑色线条正好在棕色b的顶部
class LineHighlightPainter extends DefaultHighlightPainter
class RVMHighlightPainter implements Highlighter.HighlightPainter
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);