2016-03-02 3 views
0

Вопрос: Попытка получить тот же эффект, что и код ниже, только с JTextArea, поэтому я хочу, чтобы JTextArea читались и повторялись предложения, рекомендуемые каждый раз, когда пользователь вводит новое слово с ошибкой.Чтение JTextArea для Jazzy Spell Checker API

Ниже приведен рабочий пример с «System.in», который хорошо работает.

(Варс 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(); 
    } 
    } 

То, что я пытался:

КОД (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(); 
    } 

} 

3 марта 2016 (Обновит е)

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

ответ

3

Посмотрите на Concurrency in Swing по причинам, почему ваш нынешний подход не будет работать, то есть смотреть на Listening for Changes on a Document и Implementing a Document Filter для некоторых возможных решений

Как кто-то обязан говорить об этом, DON 'T использовать KeyListener, это не является подходящим решением проблемы

Проще говоря, Swing представляет собой однопоточную фреймворк, управляемый событиями. Таким образом, все, что вы делаете, блокирует Event Dispatching Thread, не позволит ему обрабатывать новые события, в том числе события рисования, делая ваш пользовательский интерфейс невосприимчивым

В качестве среды, управляемой событиями, вам необходимо зарегистрировать интересующую вас информацию, когда происходит какое-либо событие (это пример Observer Pattern), а затем выполните соответствующие действия на основе этих событий.

Помните, вы не можете вносить изменения в Document через DocumentListener, так что будьте осторожны там

+0

А также делайте то, что рекомендует MadProgrammer, поскольку он знает свой Swing. –

+0

Мне очень трудно прочитать JTextField .. По существу, я просто поместил JTextField в свой JToolBar с кнопкой рядом с ним и т. Д. Когда кнопка нажата, она вызывает событие. Моя проблема заключается в том, что JTextField читается системой, с которой я использовал этот InputStream is = new ByteArrayInputStream (jt.getText(). GetBytes (Charset.forName («UTF-8»)); «Но он пробовал снова вернуться к той же проблеме. – TravJav92

+0

Рассмотрите возможность предоставления [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам. – MadProgrammer

3

Вы не хотите, чтобы попытаться бросить консольный код пользовательского интерфейса в GUI событийного, так как она никогда не будет работайте так. Вместо этого вам нужно использовать события GUI для запуска ваших действий, а не readln.

Первое, что вы должны решить, какое событие вы хотите использовать для запуска проверки орфографии. Для моих денег я бы получил вход пользователя в JTextField, а не в JTextArea, так как с первого, мы можем легко захватить нажатие клавиши <enter>, добавив ActionListener на JTextField. Вы всегда можете использовать оба, и затем, как только текст заклинания проверяется, переместите его в JTextArea, но это именно то, что я бы рекомендовал:

  • Использовать JTextField,
  • добавить ActionListener в JTextField получать уведомления всякий раз, когда поле имеет фокус и введите нажимается,
  • в этом слушателю, извлекать текст из JTextField, позвонив по телефону getText() на поле
  • Затем запустить заклинание проверочного кода извлеченной текста,
  • и выводят результат в соседнюю JTextArea.
+0

Когда вы говорите об использовании JTextField, я вроде как нужно использовать JTextArea, потому что приложение выглядит как приложение типа Word Document, если я не понял вас. – TravJav92

Смежные вопросы