Java 如何启动和停止高光?
我有一个看似很小的问题,但在过去的两天里我找不到一个明确的答案。我正在创建一个自动完成拼写检查程序,用于检查JTextPane(称为Java 如何启动和停止高光?,java,syntax-highlighting,spell-checking,jtextpane,Java,Syntax Highlighting,Spell Checking,Jtextpane,我有一个看似很小的问题,但在过去的两天里我找不到一个明确的答案。我正在创建一个自动完成拼写检查程序,用于检查JTextPane(称为mainTxtTypeArea)。我可以获得用户正在处理的当前单词,包括它的开始和结束索引,但是当我只想突出显示一个特定单词时,高亮显示器将继续显示键入的单词之外的内容。这是发生文档事件时调用的代码: public void checkWord(DocumentEvent e) { try { Highligh
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动作事件来监视我的文本窗格,然后将拼错的单词变成红色斜体。代码如下:
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);
}
}
我建议您使用现有组件,而不是自己实现语法高亮显示。您应该尝试使用内置了此类功能的JTextArea。它是开源的,并且非常可扩展。甚至有一个自动完成框架。@predi谢谢你的帖子,但我不允许使用任何外部程序或数据结构。这就是这个项目的目标。不过我会看一下源代码。