2016-03-02 37 views
0

問題:試圖得到儘可能下面只JTextArea中的代碼相同的效果,所以我想讀的JTextArea中和被推薦拼寫建議每次用戶鍵入一個新的拼寫錯誤的單詞。讀的JTextArea對於爵士拼寫檢查器API

下面是'System.in'的工作示例,它運行良好。

商(VAR 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日(Updat E)

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 DocumentImplementing a Document Filter對於一些可能的解決方案

正如有人必然會提到它,DON 「T使用KeyListener,它不是問題

一個合適的解決方案將更加簡單,Swing是單線程,事件驅動的框架。因此,阻止事件派發線程的任何事情都將阻止它處理新事件(包括繪畫事件),從而導致UI無響應。

作爲事件驅動的環境,您需要註冊感興趣的事件,以便在發生某些事件時收到通知這是Observer Pattern的示例),然後根據這些事件採取適當的措施。

但請記住,你無法通過DocumentListener進行更改Document,所以要小心有

+0

也做MadProgrammer建議,因爲他知道他的搖擺。 –

+0

我很難讀懂JTextField ..本質上我只是把JTextField放在我的JToolBar中,旁邊有一個Button等等。當Button被按下時,它觸發事件。我的問題是獲取系統可讀的JTextField我使用這個InputStream is = new ByteArrayInputStream(jt.getText()。getBytes(Charset.forName(「UTF-8」))); '但是現在已經被證明在同樣的問題上失敗了 – TravJav92

+0

考慮提供一個[可運行示例](https://stackoverflow.com/help/mcve),它可以說明你的問題。這不是代碼轉儲,而是您正在做的事情的一個例子,它突出了您遇到的問題。這將導致更少的混淆和更好的迴應 – MadProgrammer

3

你不想嘗試刪除控制檯UI代碼爲事件驅動的GUI,因爲它永遠不會像那樣工作。相反,您需要使用GUI事件來觸發您的操作,而不是readln。

您必須決定的第一件事是您希望用來觸發拼寫檢查的事件。對於我的錢,我會在JTextField中獲取用戶輸入,而不是JTextArea,因爲使用前者,我們可以通過在JTextField上添加一個ActionListener來輕鬆捕獲按鍵鍵盤上的<enter>。你總是可以同時使用,然後一旦文本進行拼寫檢查,將其移動到JTextArea中,而這正是我建議:

  • 使用一個JTextField,
  • 添加一個ActionListener JTextField的每次按下領域已經集中,並進入通知,
  • 這個監聽器內,提取JTextField中的文本,通過在現場呼籲getText()
  • 然後在提取的文本運行拼寫檢查代碼,
  • 和將結果輸出到附近的JTextArea中。
+0

當你談到使用JTextField時,我有點需要使用JTextArea,因爲應用程序的想法就像一個Word文檔類型的應用程序,除非我誤解了你。 – TravJav92