java - 如何开始和停止亮点?

标签 java syntax-highlighting spell-checking jtextpane

我有一个看似很小的问题,但在过去的两天里我找不到明确的答案。我正在创建一个自动完成拼写检查器,用于检查 JTextPane(称为 mainTxtTypeArea)。我可以获得用户正在处理的当前单词及其开始和结束索引,但是当我只想突出显示一个特定单词时,荧光笔将继续超出键入的单词。这是文档事件发生时调用的代码:

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) {}
        }

我也对任何替代方案持开放态度。我尝试使用样式,但它引发异常,因为样式无法应用于文档监听器。

最佳答案

好的,我找到了替代方案。我没有使用文档监听器,而是使用 KeyReleased 操作事件来监视我的文本 Pane ,然后将拼写错误的单词设置为红色斜体。代码如下:

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

关于java - 如何开始和停止亮点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10329300/

相关文章:

json - 创建 Visual Studio Code 扩展以实现自定义语言的语法突出显示

spell-checking - Hunspell 的示例/教程

java - Gradle 同步失败版本不支持 ModelBuilder API,而版本为 3.3

java - 如何在 Java 中高效地对充当计时器的 String 执行操作

用于在 BlogSpot 上写博客的 C# 语法荧光笔

Eclipse 语法着色使我的代码难以辨认

algorithm - 在不使用字典的情况下识别拼写错误的算法是什么?

python - 如何使用 pyhunspell 向 .dic/.aff 文件添加新词?

java - JFrame 中的 JButton 对齐

Java - 集合和数组表