【问题标题】:How to use LayeredHighlighter - One highlight on top of another如何使用 LayeredHighlighter - 一个突出显示在另一个之上
【发布时间】:2012-01-31 16:33:14
【问题描述】:

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

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

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

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

我想我需要使用 LayeredHighlighter。我尝试使用painter.paintLayer(...) 来使用它,我在创建灰色高亮时使用了它。

有没有办法将我的灰色高亮设置在后面,这样当我选择整行时我的鼠标蓝色高亮就会出现在它上面?所以整行应该是蓝色的

谢谢:)

【问题讨论】:

    标签: java swing


    【解决方案1】:

    没用过J/XLayer,不过JViewport或者Glass/RootPane还有另外一种画法,理论上可以创建3层画法

    编辑

    使用J/XLayer 是否还有另一个问题需要模拟MouseEvent,例如this way

    【讨论】:

      【解决方案2】:

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

      所以解决方案(对我有用)是使用Highlighter.HighlightPainter 添加亮点。确保它不是LayeredHighlighter.LayerPainter;即可能使用直接从Highlighter.HighlightPainter 派生的匿名类。不要使用DefaultHighlighter.DefaultHighlightPainter,因为那是LayeredHighlighter.LayerPainter 的子类。但也许您的Highlighter.HighlightPainter 实现可以保留对DefaultHighlighter.DefaultHighlightPainter 实例的引用,并将paint(..) 请求转发给它——从而避免必须从头开始编写绘画代码。这将解决所示问题,因为每当重新绘制视图的一部分时,这个HighlightPainter-not-LayerPainter 将在选择的HighlightPainter-yes-LayerPainter 之前填充其背景部分。 (注意,Highlighter 使用什么,Layered 与否无关紧要,只有特定亮点的HighlightPainter。)

      (现在,就我而言,我也对通过选择突出显示显示底层突出显示感兴趣。我通过使用半透明选择颜色来做到这一点:jtextpane.setSelectionColor(Color(80, 120, 255, 100))。)

      【讨论】:

        【解决方案3】:

        @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);
        

        【讨论】:

          【解决方案4】:

          我向@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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-04
            • 2015-09-29
            • 1970-01-01
            • 2011-06-15
            • 2021-10-30
            • 1970-01-01
            相关资源
            最近更新 更多