1

我有一个包含 JTextPane 的 JFrame。这个 JTextPane 的目的是在我键入单词时突出显示它们,类似于程序员的文本编辑器。为了实现这一点,我扩展了 JTextPane,实现了KeyListener接口,并将它设置为self的关键侦听器。做一些重要工作的方法是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 语句进行调试,这是输出:

这是写public后输出的
启动参数:0
结束参数:6
文件长度:7
文档开始:0
文件结束:8
文字:公开

这是写静态后输出的
启动参数:7
结束参数:13
文件长度:14
文档开始: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 之类的东西不感兴趣。

4

1 回答 1

6

正如您所发现的,Document.getText()采用 start 和length,而不是 start 和end参数。我想我会为阅读您的问题但可能不会在评论中查看的其他人提供一个答案和指向 JavaDoc 的链接。

于 2009-02-23T15:54:51.360 回答