2012-05-13 3 views
-4

Я пытаюсь реализовать прослушиватель документов в своей программе. Пока каждый пользователь вводит новое слово, я получаю весь текст и сохраняю его. То, что я хочу сделать, это получить только новое слово/слова, набранные и обработанные ими. Можете ли вы дать мне советы, как я могу это сделать?Обработка текста в 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 - это конструктор, который создает элементы управления и внешний вид пользовательского интерфейса.
  • Я создал класс, который реализует DocumentListener. Таким образом, я могу переопределить абстрактные события.
  • Моя основная функция находится на дне внутри класса DocumentEventDemo, как и на самом деле.
  • Я не вижу код для класса MyEditor. Поэтому я заменил это на JTextArea, ведет себя как редактор.
  • Ваш код GetWord работает хорошо. Поздравления!
  • Ваша технология использования System.out.println не работает, поскольку приложение представляет собой приложение с графическим интерфейсом Windows, а не консоль, что хорошо работает с System.out.
  • Очевидно, что у вас все еще есть работа с функциями прослушивателя для изменения и удаления.

Удачи!

Tommy Kwee

+0

@ curious, я хотел бы дать предложение. Я заметил, что вы расстроены тем, что другие могут сердиться на вас, особенно когда вы видите бал в -4 для вопроса. Одна из причин заключается в том, что вопрос слишком широк или неопределен. Он не указывает вашу проблему. Вопрос кажется студентом с домашним заданием или профессионалом с заданием, но не хочет прикладывать усилий для изучения. Нам нравится, когда люди стараются учиться. Если я вижу код у собеседника, тогда я могу лучше понять проблему и вопрос. И я буду больше сочувствовать этому человеку. Продолжайте ... –

+0

@ curious, Продолжение ... В исходной проблеме возникли две проблемы. Во-первых, получение текстов из объекта Document и во-вторых, создание пользовательского интерфейса с прослушивателями. Это не было очевидно из первоначального вопроса. Но по крайней мере сейчас, мы добираемся до этого этапа после пары циклов между нами. Кстати, я тоже изучаю библиотеку Swing UI. Хороший документ Sun Oracle, я думаю, это http://docs.oracle.com/javase/1.4.2/docs/api/overview-tree.html. –

+1

Большое спасибо за объяснения. Я действительно ценю это. Я попробую загрузить код с этого момента, когда я попрошу о помощи. Я ничего не загружал здесь раньше, потому что я не просил исправления, а не альтернативы, но, возможно, когда вы увидели мой код, у вас появилось лучшее представление о том, что мне нужно :) Я рад слышать, что другие изучают интерфейс Swing как и я :) Я буду проверять другие темы и попытаться помочь другим людям :) – curious

1

Как насчет документа на http://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html? В принципе, параметр DocumentEvent из события insertUpdate содержит текст. Вам нужно будет извлечь тексты из объекта e.

Мое предложение - попробовать какой-то код, и мы увидим, насколько вы знаете о DocumentListener, хорошо?

+0

@ curious, я рассмотрел ваш код ниже и это не та же структура кода, что и http://docs.oracle.com/javase/tutorial/uiswing/examples/events/DocumentEventDemoProject/src/events/DocumentEventDemo.java. Это будет работать для обработки событий. Кроме того, я предлагаю код, похожий на ваш. Pls быть терпеливым. –

+0

спасибо :) Я на самом деле пытался следовать коду в ссылке выше, но ...Во всяком случае, код сейчас работает, сейчас я в процессе его улучшения. – curious

+0

@ Оригинальный Android, я наконец понял, что вы имели в виду под «это не такая же структура» !!!!!! Этот комментарий помог мне разобраться с проблемой, которая появляется с моим кодом !!!! Спасибо, что заметили это !!! – curious

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