阅读JTextArea用于Jazzy Spell Checker API

时间:2016-03-02 23:05:19

标签: java swing jtextarea spell-checking

问题:尝试仅使用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);
      }   

2 个答案:

答案 0 :(得分:3)

请查看Concurrency in Swing了解您当前方法无效的原因,然后查看Listening for Changes on a DocumentImplementing a Document Filter了解可能的解决方案

有人必须提及它,不要使用KeyListener,这不是解决问题的合适方法

简单来说,Swing是一个单线程,事件驱动的框架。因此,阻止事件调度线程的任何操作都将阻止它处理新事件,包括绘制事件,使您的UI无响应

作为一个事件驱动的环境,您需要注册对某些事件发生时已通知的感兴趣(这是Observer Pattern的示例),然后根据这些事件采取适当的操作。

请注意,您无法通过DocumentDocumentListener进行更改,因此请注意

答案 1 :(得分:3)

您不想尝试将控制台UI代码放入事件驱动的GUI中,因为它永远不会像那样工作。相反,您需要使用GUI事件来触发您的操作,而不是阅读。

您必须决定的第一件事是您希望用于触发拼写检查的事件。为了我的钱,我在JTextField中获得了用户的输入,而不是JTextArea,因为对于前者,我们可以通过在JTextField上添加ActionListener来轻松捕获<enter>键按下。您可以随时使用两者,然后在对文本进行拼写检查后,将其移至JTextArea,但这正是我推荐的内容:

  • 使用JTextField,
  • 将一个ActionListener添加到JTextField,以便在该字段具有焦点并按下Enter时通知
  • 在此侦听器中,通过调用字段上的getText()从JTextField中提取文本
  • 然后在提取的文字上运行拼写检查代码,
  • 并将结果输出到附近的JTextArea。