我很难理解 LayeredHighlighter。我有两个亮点。 一个是在创建 textarea 区域时突出显示文本。另一个荧光笔是滚动文本时获得的高亮显示。
我遇到的问题是我用鼠标使用的突出显示不会与创建文本区域时设置的文本上的突出显示重叠。
下面是创建textarea时高亮显示的文字
当我使用鼠标突出显示整个文本时,它不会出现在顶部
我想我需要使用 LayeredHighlighter。我尝试通过 painter.paintLayer(...)
来使用它 我在创建灰色高光时使用了它。
有没有把我的灰色高亮设置到后面,这样当我选择整行时,我的鼠标蓝色高亮会出现在它上面?所以整条线应该是蓝色的
谢谢 :)
最佳答案
在Core Swing book, page 262 ,有一些关于语义的文档(与 API 引用不同)。它似乎归结为一个只有两层的系统。除了使用不是 LayeredHighlighter.LayerPainter
的Highlighter.HighlightPainter
(有点反-直观的设计模式)与使用一个。第一种类型的高光画家将先行(以任意顺序)。然后是所有的 LayerPainter
。同样以任意顺序,但我们可以猜测首先绘制选择高光(它使用 LayerPainter
),然后在顶部绘制其他 LayerPainter
高光。
因此(对我有用的)解决方案是使用 Highlighter.HighlightPainter
添加高光。确保它不是 LayeredHighlighter.LayerPainter
;即可能使用直接从 Highlighter.HighlightPainter
派生的匿名类。不要使用 DefaultHighlighter.DefaultHighlightPainter
,因为它是 LayeredHighlighter.LayerPainter
的子类。但也许您的 Highlighter.HighlightPainter
实现可以保留对 DefaultHighlighter.DefaultHighlightPainter
实例的引用,并将 paint(..)
请求转发给它——这样就避免了从头开始编写绘画代码。这将解决所说明的问题,因为每当重新绘制 View 的一部分时,此 HighlightPainter
- 而不是 - LayerPainter
将在选择 HighlightPainter
-是-LayerPainter
。 (请注意,使用什么Highlighter
,是否使用Layered
并不重要,只有特定高亮的HighlightPainter
。)
(现在,就我而言,我还对通过选择高亮显示底层高亮感兴趣。我通过使用半透明选择颜色做到了这一点:jtextpane.setSelectionColor(Color(80, 120, 255, 100))
.)
关于java - 如何使用 LayeredHighlighter - 一个高亮显示在另一个之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9083206/