Выделите текст в определенной строке в JTextArea, используя Start и End Offset

У меня есть метод, который выделяет все вхождения слова в текстовой области. Есть ли способ использовать начальное и конечное смещение, чтобы выделить слово только в этой строке.

Мои текущие коды.

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. Любая помощь по этому вопросу очень ценится.

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

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) {
    }
}
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, а затем, когда вы добавляете выделение, вам нужно добавить значение начала к смещению выделения.

Другие вопросы по тегам