简体   繁体   English

JTextPane 突出显示文本

[英]JTextPane highlight text

Can I highlight some text into a JTextPane starting from a value and ending from another value like the following but with the yellow color?我可以将一些文本突出显示到JTextPane从一个值开始并从另一个值结束,如下所示,但颜色为黄色吗?

"" JTextPane highlight text "" ""JTextPane突出显示文本""

Thanks.谢谢。

As often there are several possibilities, depending on what you really mean by "highlight":-)通常有几种可能性,这取决于“突出显示”的真正含义:-)

Highlight by changing any style attributes of arbitrary text parts on the document level, something like通过在文档级别更改任意文本部分的任何样式属性来突出显示,例如

    SimpleAttributeSet sas = new SimpleAttributeSet();
    StyleConstants.setForeground(sas, Color.YELLOW);
    doc.setCharacterAttributes(start, length, sas, false);

Highlight via a Highlighter on the textPane level:通过 textPane 级别的 Highlighter 突出显示:

    DefaultHighlighter.DefaultHighlightPainter highlightPainter = 
        new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
    textPane.getHighlighter().addHighlight(startPos, endPos, 
            highlightPainter);

https://web.archive.org/web/20120530071821/http://www.exampledepot.com/egs/javax.swing.text/style_HiliteWords.html https://web.archive.org/web/20120530071821/http://www.exampledepot.com/egs/javax.swing.text/style_HiliteWords.html

JTextArea textComp = new JTextArea();

// Highlight the occurrences of the word "public"
highlight(textComp, "public");

// Creates highlights around all occurrences of pattern in textComp
public void highlight(JTextComponent textComp, String pattern)
{
    // First remove all old highlights
    removeHighlights(textComp);

    try
    {
        Highlighter hilite = textComp.getHighlighter();
        Document doc = textComp.getDocument();
        String text = doc.getText(0, doc.getLength());
        int pos = 0;

        // Search for pattern
        // see I have updated now its not case sensitive 
        while ((pos = text.toUpperCase().indexOf(pattern.toUpperCase(), pos)) >= 0)
        {
            // Create highlighter using private painter and apply around pattern
            hilite.addHighlight(pos, pos+pattern.length(), myHighlightPainter);
            pos += pattern.length();
        }
    } catch (BadLocationException e) {
    }
}

// Removes only our private highlights
public void removeHighlights(JTextComponent textComp)
{
    Highlighter hilite = textComp.getHighlighter();
    Highlighter.Highlight[] hilites = hilite.getHighlights();
    for (int i=0; i<hilites.length; i++)
    {
        if (hilites[i].getPainter() instanceof MyHighlightPainter)
        {
            hilite.removeHighlight(hilites[i]);
        }
    }
}

// An instance of the private subclass of the default highlight painter
Highlighter.HighlightPainter myHighlightPainter = new MyHighlightPainter(Color.red);

// A private subclass of the default highlight painter
class MyHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter
{
    public MyHighlightPainter(Color color)
    {
        super(color);
    }
}

Yes you can via the functions setSelectionStart and setSelectionEnd from JTextComponent which JTextPane inherits from.是的,您可以通过JTextPane继承的JTextComponent 的setSelectionStartsetSelectionEnd函数。

see javadoc of JTextComponent.setSelectionStart参见JTextComponent.setSelectionStart 的 javadoc

Did you try java's string comparison method你有没有试过java的字符串比较方法

.equalsIgnoreCase("Search Target Text")

Because this method allows a search without having to take the case of a string into account This might be the ticket to what you are trying to achieve因为此方法允许搜索而不必考虑字符串的大小写 这可能是您尝试实现的目标

Hope this helps you Makky希望这对你有帮助

performance wise its better to put the toUpperCase on性能明智最好将 toUpperCase 放在

String text = doc.getText(0, doc.getLength()); String text = doc.getText(0, doc.getLength());

rather than in the while loop而不是在 while 循环中

but thanks for the good example.但感谢你的好例子。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM