Как работает подсветка Java Swing в крайних случаях?

У меня есть этот код:

JTextArea textComp;

Highlighter hilite = textComp.getHighlighter();

if (word.toString().equals(pattern[i])) 
{
    hilite.addHighlight(posStart, (posEnd), myHighlighter);
    break;
}

word это StringBuilder

Предположим, что условие в if спички и hilite.addHighlight(posStart, (posEnd), myHighlighter); - это заявление собирается выполнить. Тогда textComp содержит

int myVar

И я стараюсь так выделить

int myVar

В это время, posStart = 0 а также posEnd = 3, Но как я вхожу что-то в textArea маркер расширяется до конца так:

int myVar

Кто-нибудь может мне с этим помочь?

И если я сделаю заявление:

hilite.addHighlight(posStart, (posEnd-1), myHighlighter);

Затем с posStart=0, posEnd=3только тогда

*в* t myVar это происходит. то есть "в" выделен, но "т" нет!

РЕДАКТИРОВАТЬ Функция:

Highlighter.HighlightPainter myHighlighter = new MyHighlightPainter(
                    Color.LIGHT_GRAY);

            try {
                Highlighter hilite = textComp.getHighlighter();
                Document doc = textComp.getDocument();
                String text = doc.getText(0, doc.getLength());
                String[] words = text.split(" ");

                                int posEnd, posStart = 0;
                while (text.length() > posStart) {
                    posEnd = posStart;
                    StringBuilder word = new StringBuilder();
                    while (posEnd < text.length() && text.charAt(posEnd) != ' ') {
                        word.append(text.charAt(posEnd++));
                    }
                    for (int i = 0; i < pattern.length; i++) {

                        if (word.toString().equals(pattern[i])) {
                            hilite.addHighlight(posStart, (posEnd-1), myHighlighter);
                            break;
                        }

                    }
                    posStart = posStart + posEnd + 1;
                }
            } catch (BadLocationException e) {
            }

3 ответа

Решение

Я сделал это, чтобы решить проблему:

int wordEnd = 0, wordStart = 0;




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

                        while (text.length() > wordEnd) 
                        {
                            String word = new String();
                            if(text.charAt(wordEnd) == ' ')
                            {
                                word = text.substring(wordStart, wordEnd);
                                for (int i = 0; i < pattern.length; i++) 
                                {
                                        if (word.toString().equals(pattern[i])) 
                                        {
                                            hilite.addHighlight(wordStart, (wordEnd), myHighlighter);

                                            break;
                                        }
                                }
                                wordStart = wordEnd + 1;
                            }
                            wordEnd++;
                        }

Что я сделал, так это получил слово, обнаружив после него пробел (вы можете расширить логику), а затем выделив предыдущее слово. Это непрерывно на протяжении всего набора текста.

на самом деле мне было интересно, как работает этот маркер!

Да, API сбивает с толку. Я полагаю, что первый индекс должен быть инклюзивным, а последний - эксклюзивным.

Всякий раз, когда я выделяю слово при поиске слова, я использую такой код:

String text = "one two three four...";
String search "three";

int offset = text.indexOf(search);

if (offset != -1)
    textPane.getHighlighter().addHighlight(offset, offset + search.length(), painter);

Похоже, ваша проблема не в том, как выделитель выделяет текст, а в том, как выделение изменяется при редактировании текста. Вы можете справиться с этим, добавив прослушиватель изменений в TextAreaи корректировка затронутых бликов (используя changeHighlight()) по мере необходимости.

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