【问题标题】:Highlight a text on specific line in JTextArea using Start and End Offset使用开始和结束偏移突出显示 JTextArea 中特定行上的文本
【发布时间】:2013-03-05 16:20:17
【问题描述】:

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

我当前的代码。

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) {
    }
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发布SSCCE。 -- 不要忽略异常输出。 } catch (BadLocationException e) { } 应该是 } catch (BadLocationException e) { e.printStackTrace(); }

标签: java jtextarea swing-highlighter


【解决方案1】:
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 的值添加到高亮偏移量。

【讨论】:

  • 但是如果偏移量从 0 开始,它不会突出显示所有其他出现的“in”吗?如果你能在代码方面提供我,你上面提到的。谢谢
【解决方案2】:

得到它的工作谢谢@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) {
    }
}

【讨论】:

    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多