2012-05-13 44 views
-4

我想在我的程序中實現一個Document Listener。到目前爲止,每當用戶輸入一個新單詞時,我都會獲取整個文本並將其保存。我想要做的只是輸入新的單詞/單詞並處理它們。你能給我一些建議嗎?在jTextArea中處理文本

+3

我認爲DocumentListener提供了非常清晰的API(插入/刪除)。你不知道哪一部分?你試過什麼了? –

+0

我瞭解DocumentListener的工作原理。我沒有得到的是如何捕捉輸入的整個單詞。目前,我正在捕捉每個單獨的字母,以便用戶輸入。這就是爲什麼要處理文本中的每個單詞,我需要每次發生變化時都可以獲取文檔的全部文本。 – curious

+0

你到底在做什麼?一旦你捕捉到這些詞,你會怎麼做?您是否嘗試過使用掃描儀檢索文本?或者做簡單的測試尋找空白? –

回答

0

下面提出類似的代碼到你上面:

import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.util.Arrays; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Document; 


//public class DocumentListener {  // Fix: not a good name for the class since it is part of JVM 
    public class DocumentEventDemo extends JFrame { // easier than extends JPanel 
     JPanel txtPanel, centerPanel; 
     GridLayout grid; 

     JTextField txtField; 
     JTextArea txtArea; 
     JFrame frame; 
     JComponent newContentPane; 

     FlowLayout flow; 

     public DocumentEventDemo() { 

      txtArea = new JTextArea(); 
      txtArea.getDocument().addDocumentListener(new MyDocumentListener()); 
      txtArea.getDocument().putProperty("txtArea", "MyDocumentListener"); 

//  txtField = new JTextField(10); // 10 chars max 
//  txtField.setText("12345"); 

      centerPanel = new JPanel(); 
      grid = new GridLayout(2,1,1,1); 

      txtPanel = new JPanel(); 
      flow = new FlowLayout(FlowLayout.CENTER); 
      txtPanel.setLayout(flow); 

      //Adding control GUI fields to the only panel 
      // txtPanel.add(txtArea); 
      // txtPanel.add(txtField); 


      // Forming the center view with GUI controls 
      centerPanel.setLayout(grid); 
//  centerPanel.add(txtPanel); 
      centerPanel.add(txtArea); 

      // Add Panels to the Frame 
      getContentPane().add(centerPanel,"Center"); 

      this.setSize(500,200); 
      this.validate(); 
      this.setVisible(true); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

//  newContentPane = getRootPane(); 
//  newContentPane.setOpaque(true); 
//  frame.setContentPane(newContentPane); 

} 

    //MyEditor editor = new MyEditor(); // what is MyEditor? 

    //javax.swing.event.DocumentListener mydocumentListener = new javax.swing.event.DocumentListener() 

    // Make a class to define the inherited abstract methods, which are also events. 
    class MyDocumentListener implements DocumentListener { 
     String[] word=new String[50]; 
     String text; 
     int i=0; 
     int y; 
     int l; 
     int len; 

     public void changedUpdate(DocumentEvent documentEvent) { 
      System.out.println("The text has been changed."); 
     } 

     public void insertUpdate(DocumentEvent documentEvent) { 
      try { 
       GetWord(documentEvent); 
      } catch (BadLocationException ex) { 
       Logger.getLogger(DocumentListener.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

     public void removeUpdate(DocumentEvent documentEvent) { 
      System.out.println("A character has been removed!"); 
     } 

     private void GetWord(DocumentEvent documentEvent) throws BadLocationException { 
      //get the type of event 
      DocumentEvent.EventType type = documentEvent.getType(); 
      //check what is the event, hence what is the user doing 
      if (type.equals(DocumentEvent.EventType.INSERT)) { 
       Document source = documentEvent.getDocument(); 

       y=documentEvent.getOffset(); 
       l=documentEvent.getLength(); 
       len=source.getLength(); 

       text = source.getText(y,l); 
       if(text.equals(" ")) 
       { 
        for (int z=0;z<len;z++) 
        { 
         System.out.print(word[z]); 
        } 
        System.out.println("\n"); 
        Arrays.fill(word,null); 
        i=0; 
       } 

       word[i]=text; 
       i++; 
      } else { 
       System.out.println("A character has been removed!"); 
      } 
     } 
    }; // DocumentListener class instantiation 


// editor. editArea.getDocument().addDocumentListener(mydocumentListener); 


    public static void main(String args[]){ 
     new DocumentEventDemo(); 
    } 

} // TOP class 

注:

  • 我最外類擴展JFrame中,創建窗口&聽衆最簡單的方式,我覺得。
  • DocumentEventDemo是一個構造函數,用於創建UI控件和外觀。
  • 我創建了一個實現DocumentListener的類。這樣我可以重寫抽象事件。
  • 我的主要功能是在類DocumentEventDemo的底部,就像你的實際一樣。
  • 我沒有看到類MyEditor的代碼。因此,我用JTextArea替換了它,表現得像一個編輯器。
  • 您的代碼GetWord似乎運作良好。恭喜!
  • 您使用System.out.println的技術不起作用,因爲該應用程序是Windows GUI應用程序而不是控制檯,與System.out很好地協作。
  • 顯然,您仍然可以使用Listener函數來進行更改和刪除。

玩得開心!

Tommy Kwee

+0

@不好意思,我想提一個建議。我注意到你似乎很沮喪別人可能會對你生氣,尤其是當你看到這個問題的分數爲-4。原因之一是這個問題太廣泛或模糊。它沒有指定你的問題。這個問題看起來像一個有家庭作業的學生,​​或者是一個有任務的專業人員,但不想花費精力去學習。我們希望看到人們努力學習。 如果我看到提問者的代碼,那麼我可以更好地理解問題和問題。當然,我會更加同情這個人。繼續... –

+0

@真誠,續...在原始問題中,我認爲有兩個問題。首先,從Document對象獲取文本,其次,與偵聽器一起創建UI。原來的問題並不明顯。但至少現在,在我們之間的情侶圈之後,我們達到了這個階段。 btw,我也在學習Swing UI庫。我認爲一個很好的Sun Oracle文檔是http://docs.oracle.com/javase/1.4.2/docs/api/overview-tree.html。 –

+1

非常感謝解釋。我很欣賞這一點。當我尋求幫助時,我會嘗試從現在開始上傳代碼。我之前並沒有在這裏上傳任何東西,因爲我並沒有要求修復,而是尋求替代方案,但也許當你看到我的代碼時,你對我需要的東西有了更好的瞭解:)我很高興聽到其他人正在學習Swing UI就像我:)我會檢查其他線程,並嘗試幫助其他人以及:) – curious

1

如何在http://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html文件? 基本上,insertUpdate事件的參數DocumentEvent包含文本。您將不得不從對象e中檢索文本。

我的建議是嘗試一些代碼,我們會看看您對DocumentListener瞭解多少,好嗎?

+0

@curious,我在下面檢查了你的代碼,它與http://docs.oracle.com/javase/tutorial/uiswing/examples/events/DocumentEventDemoProject/src/events/DocumentEventDemo.java的代碼結構不一樣。這將適用於事件處理。除此之外,我會提出類似於你的代碼。請耐心等待。 –

+0

謝謝:)我實際上試圖按照上面鏈接中的代碼,但是...無論如何,現在我正在改進它的代碼是有用的。 – curious

+0

@原創Android,我終於明白你的意思了「它不是一樣的結構」!!!!!!此評論幫助我理清了與我的代碼一起出現的問題!感謝您注意! – curious