2012-05-13 46 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