1

JTextPane を含む JFrame があります。この 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 ステートメントも追加しました。これが出力です。

これは public を書いた後に出力されます
開始パラメータ:0
終了パラメータ:6
ドキュメントの長さ:7
ドキュメント START:0
ドキュメントEND:8
テキスト:公開

これは static を書き込んだ後に出力されます
開始パラメータ:7
終了パラメータ:13
ドキュメントの長さ:14
ドキュメント START:0
ドキュメントEND: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 とend引数ではなく、 start とlengthを取ります。コメントを見ていないかもしれないあなたの質問を読んでいる他の人のために、回答とJavaDocへのリンクを提供すると思いました。

于 2009-02-23T15:54:51.360 に答える