【问题标题】:Overlapped highligted text color in JTextPaneJTextPane 中重叠突出显示的文本颜色
【发布时间】:2013-08-20 23:37:44
【问题描述】:

我创建了一个使用 JTextPane 的 Swing 界面。 JTextPane 使用自定义颜色突出显示:

textPane.getHighlighter().addHighlight(startPos, endPos, highlightPainter); 

用户还可以以普通方式使用光标突出显示文本。

我的问题是,我无法找到一种方法,将由荧光笔对象和光标选择突出显示的文本着色为第三种不同的颜色。高亮对象的高亮总是优先。

我尝试使用 CaretListener 对象,但它仅在用户手动突出显示后释放鼠标时触发事件。我需要重叠来渲染 用户正在使用光标调整突出显示的区域。

我什至会很高兴光标突出显示优先于荧光笔对象的突出显示,但独特的重叠颜色是一个更可取的功能。

下面的问题和我的类似:

How to use LayeredHighlighter - One highlight on top of another

但唯一的答案只是链接到覆盖 GlassPane 的方法。但是,我更喜欢 JTextPane 或文档级解决方案,因为所选文本的值很重要,因为

textPane.getSelectionStart();

textPane.getSelectionEnd();

【问题讨论】:

  • 我认为CaretListener 是不够的,它只会讲述事实“之后”的亮点。您可以将ChangeListener 直接附加到Caret。查看this example了解更多详情

标签: java swing jtextpane


【解决方案1】:

我什至会很高兴光标突出显示优先于荧光笔对象的突出显示

JTextPane textPane = new JTextPane(...);
DefaultHighlighter highlighter =  (DefaultHighlighter)textPane.getHighlighter();
highlighter.setDrawsLayeredHighlights(false);

【讨论】:

  • @MadProgrammer,我不得不承认我并不真正了解这个属性。我认为默认值应该是“false”,因为查看选定的文本确实有意义。当您手动添加荧光笔时,它还会更改突出显示的方式。现在,如果您手动突出显示两行文本,即使文本没有到达末尾,整行也会突出显示。当使用“true”时,只有文本会突出显示。
【解决方案2】:

我用透明度的 alpha 值构建了非选择的自定义突出显示颜色(默认为完全不透明):

Color myColor = new Color( rValFloat, gValFloat, bValFloat, alpha);

这并不能让我完全控制重叠区域的颜色,因为突出显示是光标突出显示和我上面的颜色的混合,但我也可以更改光标的选择颜色:

textPane.setSelectionColor(mySelectionColor);

这对我的目的来说已经足够控制了。

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2010-10-18
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多