Pregunta

Tengo un JFrame que contiene una JTextPane. El propósito de este JTextPane es resaltar palabras, mientras les escribo, algo en la línea de editor de texto de un programador. Para lograr esto, extendió JTextPane, que implementó el KeyListener interfaz, y lo tenía como una configuración detector de teclas a uno mismo. El método que hace un trabajo importante es keyReleased . El problema es, que puedo resaltar la primera palabra que escribo, pero después de eso, seguir recibiendo BadLocation, a pesar de que el Inicio y final se encuentran dentro de los límites del documento. Estoy publicar algunos de mis fragmentos de código:


// 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;
            }
        }
    }

He intentado escribir: public static , pero sólo público es de color rojo. Incluso he añadido algunas sentencias println para la depuración, y este es el resultado:

this is outputted after writing public
Start param:0
End param:6
Document Length:7
Document START:0
Document END:8
text:public

this is outputted after writing static
Start param:7
End param:13
Document Length:14
Document START:0
Document END:15
text:public static 
javax.swing.text.BadLocationException: Invalid location
        at javax.swing.text.GapContent.getChars(GapContent.java:189)
        at javax.swing.text.GapContent.getString(GapContent.java:167)
        at javax.swing.text.AbstractDocument.getText(AbstractDocument.java:774)
        at ifirst.visual.CodePanel.highlight(CodePanel.java:49)
        at ifirst.visual.CodePanel.keyReleased(CodePanel.java:82)
        at java.awt.Component.processKeyEvent(Component.java:6069)
        at javax.swing.JComponent.processKeyEvent(JComponent.java:2810)
        at java.awt.Component.processEvent(Component.java:5885)
        at java.awt.Container.processEvent(Container.java:2105)
        at java.awt.Component.dispatchEventImpl(Component.java:4469)
        at java.awt.Container.dispatchEventImpl(Container.java:2163)
        at java.awt.Component.dispatchEvent(Component.java:4295)
        at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1881)
        at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:742)
        at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1007)
        at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:879)
        at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:706)
        at java.awt.Component.dispatchEventImpl(Component.java:4339)
        at java.awt.Container.dispatchEventImpl(Container.java:2163)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4295)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

Estoy escribiendo este código para obtener una caída de JTextPane. No estoy interesado en algo así como JTextPane .

¿Fue útil?

Solución

A medida que descubrió, la Document.getText () tiene un comienzo y longitud , no un comienzo y final argumento. Pensé en dar una respuesta y un enlace a la JavaDoc para otros la lectura de su pregunta que no podría mirar en los comentarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top