0

一見小さな問題があるように見えますが、過去 2 日間で明確な答えを見つけることができませんでした。JTextPane (と呼ばれる) をチェックするオートコンプリート スペル チェッカーを作成していますmainTxtTypeArea。ユーザーが作業している現在の単語を開始インデックスと終了インデックスで取得できますが、特定の 1 つの単語のみを強調表示したい場合、ハイライターは入力された単語を超えて続行します。これは、ドキュメント イベントが発生したときに呼び出されるコードです。

public void checkWord(DocumentEvent e) {
            try {
                Highlighter redZigZag = mainTxtTypeArea.getHighlighter();
                int start = Utilities.getWordStart(mainTxtTypeArea, e.getOffset());
                int end = Utilities.getWordEnd(mainTxtTypeArea, e.getOffset());
                int length = end - start;
                String word = mainTxtTypeArea.getDocument().getText(start, length);

                if(dictionary.find(word) == false && Character.isWhitespace(word.charAt(0)) == false){
                    System.out.println("Incorrect: "+word);
                    //I found a zigzag highlighter online, but the default yields the same result
                    redZigZag.addHighlight(start, end, painter);
                } else {
                    System.out.println("Correct: "+word);
                }

            } catch (BadLocationException ex) {}
        }

私はあらゆる代替案にもオープンです。スタイルを使用しようとしましたが、スタイルをドキュメント リスナーに適用できないため、例外がスローされます。

4

1 に答える 1

1

OK、代替手段を見つけました。ドキュメント リスナを使用する代わりに、KeyReleased アクション イベントを使用してテキスト ペインを監視し、スペルミスのある単語を赤いイタリック体にします。コードは以下のとおりです。

private void mainTxtTypeAreaKeyReleased(java.awt.event.KeyEvent evt) {
    checkWord();
}

private void checkWord() {
    try {
        int start = Utilities.getWordStart(mainTxtTypeArea, mainTxtTypeArea.getCaretPosition());
        int end = Utilities.getWordEnd(mainTxtTypeArea, mainTxtTypeArea.getCaretPosition());
        int length = end - start;

        if(length > 0) {
            StyledDocument doc = mainTxtTypeArea.getStyledDocument();
            SimpleAttributeSet as = new SimpleAttributeSet();

            if(dictionary.find(doc.getText(start, length)) == false){
                StyleConstants.setItalic(as, true);
                StyleConstants.setForeground(as, Color.red);
            } else {
                StyleConstants.setItalic(as, false);
                StyleConstants.setForeground(as, Color.BLACK);
            }
            doc.setCharacterAttributes(start, length, as, false);
        }
    } catch (BadLocationException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
}
于 2012-04-28T07:59:02.743 に答える