JTextPane продолжает бросать BadLocation
У меня есть JFrame, содержащий JTextPane. Цель этой JTextPane - выделять слова, когда я их набираю, что-то вроде текстового редактора программиста. Для этого я расширил JTextPane, реализовал интерфейс KeyListener и настроил его как ключевого слушателя для себя. Метод, выполняющий важную работу, - это keyReleased . Проблема в том, что я могу выделить первое слово, которое я набираю, но после этого я продолжаю получать BadLocation, даже если начало и конец находятся в пределах документа. Я публикую некоторые из своих фрагментов кода:
// this is my highlight method
private void highlight(int start,int end) throws BadLocationException {
Document doc = getDocument();
Color c = Color.red;
String text = doc.getText(start,end);
StyleContext sc = StyleContext.getDefaultStyleContext();
AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c);
setCharacterAttributes(aset, true);
setSelectionStart(start);
setSelectionEnd(end);
replaceSelection(text);
}
//this is my keyReleased method
public void keyReleased(KeyEvent arg0) {
char character = arg0.getKeyChar();
if(wordStarted) { // have I started typing a new word ?
if(character == ' ') { // end word
try {
int dot = getCaret().getDot();
highlight(wordStart, dot - 1);
setCaretPosition(dot);
wordStarted = false;
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
}
else {
if(Character.isLetter(character)) {
wordStarted = true;
wordStart = getCaret().getDot() -1;
}
}
}
Я попытался ввести: public static, но только public выделен красным. Я даже добавил несколько операторов println для отладки, и вот результат:
это выводится после написания общедоступного Параметр запуска: 0 Конечный параметр: 6 Длина документа: 7 Документ START: 0 КОНЕЦ документа: 8 текст: общедоступный это выводится после записи статического Параметр запуска: 7 Конечный параметр: 13 Длина документа: 14 Документ START: 0 КОНЕЦ документа: 15 текст: общедоступный статический javax.swing.text.BadLocationException: недопустимое местоположение в javax.swing.text.GapContent.getChars (GapContent.java:189) в javax.swing.text.GapContent.getString (GapContent.java:167) в javax.swing.text.AbstractDocument.getText (AbstractDocument.java:774) в ifirst.visual.CodePanel.highlight (CodePanel.java:49) в ifirst.visual.CodePanel.keyReleased (CodePanel.java:82) в java.awt.Component.processKeyEvent (Component.java:6069) в javax.swing.JComponent.processKeyEvent (JComponent.java:2810) в java.awt.Component.processEvent (Component.java:5885) в java.awt.Container.processEvent (Container.java:2105) в java.awt.Component.dispatchEventImpl (Component.java:4469) в java.awt.Container.dispatchEventImpl (Container.java:2163) в java.awt.Component.dispatchEvent (Component.java:4295) в java.awt.KeyboardFocusManager.redispatchEvent (KeyboardFocusManager.java:1881) в java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent (DefaultKeyboardFocusManager.java:742) в java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent (DefaultKeyboardFocusManager.java:1007) в java.awt.DefaultKeyboardFocusManager.typeAheadAssertions (DefaultKeyboardFocusManager.java:879) в java.awt.DefaultKeyboardFocusManager.dispatchEvent (DefaultKeyboardFocusManager.java:706) в java.awt.Component.dispatchEventImpl (Component.java:4339) в java.awt.Container.dispatchEventImpl (Container.java:2163) в java.awt.Window.dispatchEventImpl (Window.java:2478) в java.awt.Component.dispatchEvent (Component.java:4295) в java.awt.EventQueue.dispatchEvent (EventQueue.java:604) в java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:275) в java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java:200) в java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:190) в java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:185) в java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:177) в java.awt.EventDispatchThread.run (EventDispatchThread.java:138)
Я пишу этот код, чтобы получить представление о JTextPane. Меня не интересует что-то вроде JTextPane .
Ответов (1)1
Как вы обнаружили, Document.getText () принимает начало и длину , а не аргумент начала и конца . Я подумал, что дам ответ и ссылку на JavaDoc для других, читающих ваш вопрос, которые могут не смотреть в комментариях.