如何使用LayeredHighlighter - 一个突出显示另一个

时间:2012-01-31 16:33:15

标签: java swing

我很难理解LayeredHighlighter。我有两个亮点。 一个我在创建textarea区域时突出显示文本。另一个荧光笔是滚动文本时的亮点。

我遇到的问题是我使用鼠标时突出显示的内容与创建textarea时设置的文本上的突出显示不重叠。

以下是创建textarea时突出显示的文本

Original highlight

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

With selection

我想我需要使用LayeredHighlighter。我尝试使用painter.paintLayer(...)使用它,当我创建灰色突出显示时,我使用了它。

无论如何都要将我的灰色高光设置在背面,这样当我选择整条线时,我的鼠标蓝色高光会显示在它上面吗?所以整行应该是蓝色的

谢谢:)

4 个答案:

答案 0 :(得分:3)

从未使用J/XLayer,但还有另一种绘画方式JViewportGlass/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,因为我很好地利用了HighlightPainterLayerPainter下绘制的观察结果,如下所示:

参考此图片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