2

我有一种方法可以突出显示文本区域中所有出现的单词。有没有办法使用开始和结束偏移来突出显示该行中的单词。

我目前的代码。

public static void highlight(JTextComponent textComp, String pattern) {

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

        // Search for pattern
        while ((pos = text.indexOf(pattern, pos)) >= 0) {
            // Create highlighter using private painter and apply around pattern
            hilite.addHighlight(pos, pos + pattern.length(), painter2);
            pos += pattern.length();
        }
    } catch (BadLocationException e) {
    }
}

这在执行的 JButton 操作上调用:

highlight(textArea_1, "in");

结果: 在此处输入图像描述

我尝试使用开始和结束偏移方法,但没有运气。我试图仅在第 6 行突出显示“in”。非常感谢任何帮助。

static int iline =6;

    public static void highlight(JTextComponent textComp, String pattern) {

    try {
        Highlighter hilite = textComp.getHighlighter();
        javax.swing.text.Document doc = textComp.getDocument();
        int start =((JTextArea) textComp).getLineStartOffset(iline);
        int end = ((JTextArea) textComp).getLineEndOffset(iline);
        String text = doc.getText(start,end);
        int pos = start;

        // Search for pattern
        while ((pos = text.indexOf(pattern, pos)) >= start) {
            // Create highlighter using private painter and apply around pattern
            hilite.addHighlight(pos, pos + pattern.length(), painter2);
            pos += pattern.length();
        }
    } catch (BadLocationException e) {
    }
}
4

2 回答 2

3
int start =((JTextArea) textComp).getLineStartOffset(iline);
int end = ((JTextArea) textComp).getLineEndOffset(iline);
String text = doc.getText(start,end);
int pos = start;

假设我们每行有 10 个字符。因此,如果您想要第 6 行的文本,则起始变量将等于 51,结束变量将等于 60。

当您获得第 6 行的文本时,它将仅包含 10 个字符。

因此,当您从 51 开始搜索时,您已经在搜索字符串的末尾,因此您不会得到任何匹配项。

您只需在偏移量 0 处开始搜索,然后在添加高亮时需要将 start 的值添加到高亮偏移量。

于 2013-03-17T06:14:30.007 回答
0

让它工作谢谢@camickr

代码:

public static void highlight(JTextComponent textComp, String pattern) {

    try {
        Highlighter hilite = textComp.getHighlighter();

        String text = textComp.getText();
        String line =null;
        int start = 0;
        int end;
        int totalLines = ((JTextArea) textComp).getLineCount();
        for (int i=0; i < totalLines; i++) {

            if(i==5){ //Line Numbers Decrement by 1
            start = ((JTextArea) textComp).getLineStartOffset(i);
            end   = ((JTextArea) textComp).getLineEndOffset(i);
            line = text.substring(start, end);
            System.out.println("My Line: " + line);
            System.out.println("Start Position of Line: " + start);
            System.out.println("End Position of Line: " + end);
            }
        }
        int pos = start;

        // Search for pattern
        if ((pos =text.indexOf(pattern, pos)) >= start) {
            // Create highlighter using private painter and apply around pattern
            hilite.addHighlight(pos, pos + pattern.length(), painter2);
            pos += pattern.length();
        }
    } catch (BadLocationException e) {
    }
}
于 2013-03-17T11:35:44.817 回答