-4

我正在尝试在我的程序中实现一个文档侦听器。到目前为止,每次用户输入一个新单词时,我都会获取整个文本并保存它。我想要做的是只获取输入的新单词/单词并处理它们。你能给我一些建议吗?

4

2 回答 2

1

http://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html上的文档怎么样?基本上,来自 insertUpdate 事件的参数 DocumentEvent 包含文本。您将不得不从对象 e 中检索文本。

我的建议是尝试一些代码,我们会看看你对 DocumentListener 了解多少,好吗?

于 2012-05-15T08:24:04.767 回答
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 函数进行更改和删除。

玩得开心!

汤米奎

于 2012-05-16T05:26:58.443 回答