问题:尝试仅使用JTextArea获得与下面代码相同的效果,因此我希望每次用户键入新的拼写错误字时都要阅读JTextArea并建议拼写建议。
下面是“System.in'”的工作示例。效果很好。
(Vars userField = JTextArea& dic.txt是系统用于建议的英语语言列表)
代码(1)
public SpellCheckExample() {
try {
SpellDictionary dictionary = new SpellDictionaryHashMap(new File(dic.txt));
spellCheck = new SpellChecker(dictionary);
spellCheck.addSpellCheckListener(this);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.print("Enter text to spell check: ");
String line = in.readLine();
if (line.length() <= 0)
break;
spellCheck.checkSpelling(new StringWordTokenizer(line));
}
} catch (Exception e) {
e.printStackTrace();
}
}
我一直在尝试:
CODE(2)
public void spellChecker() throws IOException{
String userName = System.getProperty("user.home");
SpellDictionary dictionary = new SpellDictionaryHashMap(new File(userName+"/NetBeansProjects/"+"/project/src/dic.txt"));
SpellChecker spellCheck = new SpellChecker(dictionary);
spellCheck.addSpellCheckListener(this);
try{
StringReader sr = new StringReader(userField.getText());
BufferedReader br = new BufferedReader(sr);
while(true){
String line = br.readLine();
if(line.length()<=0)
break;
spellCheck.checkSpelling(new StringWordTokenizer(line));
}
}catch(IOException e){
e.printStackTrace();
}
}
2016年3月3日(更新)
public void spellChecker() throws IOException{
// getting context from my dic.txt file for the suggestions etc.
SpellDictionary dictionary = new SpellDictionaryHashMap(new File("/Users/myname/NetBeansProjects/LifeSaver/src/dic.txt"));
SpellChecker spellCheck = new SpellChecker(dictionary);
// jt = JTextField already defined in constructors and attemtpting to pass this into system and
InputStream is = new ByteArrayInputStream(jt.getText().getBytes(Charset.forName("UTF-8")));
//spellCheck.checkSpelling(new StringWordTokenizer(line)); ""ORIGINAL"""
// reccomending cast to wordfinder
spellCheck.checkSpelling(new StringWordTokenizer(is);
}
答案 0 :(得分:3)
请查看Concurrency in Swing了解您当前方法无效的原因,然后查看Listening for Changes on a Document和Implementing a Document Filter了解可能的解决方案
有人必须提及它,不要使用KeyListener
,这不是解决问题的合适方法
简单来说,Swing是一个单线程,事件驱动的框架。因此,阻止事件调度线程的任何操作都将阻止它处理新事件,包括绘制事件,使您的UI无响应
作为一个事件驱动的环境,您需要注册对某些事件发生时已通知的感兴趣(这是Observer Pattern的示例),然后根据这些事件采取适当的操作。
请注意,您无法通过Document
对DocumentListener
进行更改,因此请注意
答案 1 :(得分:3)
您不想尝试将控制台UI代码放入事件驱动的GUI中,因为它永远不会像那样工作。相反,您需要使用GUI事件来触发您的操作,而不是阅读。
您必须决定的第一件事是您希望用于触发拼写检查的事件。为了我的钱,我在JTextField中获得了用户的输入,而不是JTextArea,因为对于前者,我们可以通过在JTextField上添加ActionListener来轻松捕获<enter>
键按下。您可以随时使用两者,然后在对文本进行拼写检查后,将其移至JTextArea,但这正是我推荐的内容:
getText()
从JTextField中提取文本