Как работает подсветка 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()
) по мере необходимости.