2013-10-07 1 views
2

Я узнаю о DocumentListener в java с JTextPane. Я пытаюсь получить текущую строку или
слово (текст), которое вставлено/удалено недавно в текстовом поле. Я попытался это:Найти Удаленный текст в JTextPane

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.text.*; 

class ChangeEffect implements DocumentListener { 
    @Override 
    public void insertUpdate(DocumentEvent de) { 
     int offset = de.getOffset(); 
     try { 
       String str = de.getDocument().getText(offset,de.getLength()); 
       System.out.println("You entered the text: " + str); 
     }catch(Exception e){e.printStackTrace();} 
    } 
    @Override 
    public void changedUpdate(DocumentEvent de) { 
    } 
    @Override 
    public void removeUpdate(DocumentEvent de) { 
     try { 
      String s = de.getDocument().getText(de.getOffset(),de.getLength()); 
      System.out.println("Removed text is: " +s); 
     }catch(Exception e){} 
    } 
} 


public class MultiModeColor { 
    private static void displayGUI() { 
     JFrame frame = new JFrame("Demo"); 
     JTextPane text = new JTextPane(); 
     frame.add(text); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setVisible(true); 
     text.getDocument().addDocumentListener(new ChangeEffect()); 
    } 

    public static void main(String[] arg) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       displayGUI(); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 

В приведенном выше примере я получил недавно вставленный текст, но удаленный текст на дисплее ничего (кроме сообщения в Println заявления).
Есть ли способ получить недавно удаленный текст из документа?

+4

Вы можете попробовать с помощью 'DocumentFilter' вместо этого .... – MadProgrammer

ответ

2

Попробуйте с помощью DocumentFilter вместо DocumentListener. Основная проблема, с которой вы сталкиваетесь, - это уведомление DocumentListener после того, как сообщение о том, что вы слушаете, уведомляется, текст уже удаляется.

DocumentFilter на другой получает уведомление первый ...

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

public class DocumentMonitor { 

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

    public DocumentMonitor() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JTextArea ta = new JTextArea(20, 20); 
       ((AbstractDocument) ta.getDocument()).setDocumentFilter(new DocumentFilter() { 

        @Override 
        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
         if (offset >= fb.getDocument().getLength()) { 
          System.out.println("Added: " + text); 
         } else { 
          String old = fb.getDocument().getText(offset, length); 
          System.out.println("Replaced " + old + " with " + text); 
         } 
         super.replace(fb, offset, length, text, attrs); 
        } 

        @Override 
        public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException { 
         System.out.println("Added: " + text); 
         super.insertString(fb, offset, text, attr); 
        } 

        @Override 
        public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException { 
         System.out.println("Removed: " + fb.getDocument().getText(offset, length)); 
         super.remove(fb, offset, length); 
        } 

       }); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JScrollPane(ta)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

Да, это использует JTextArea, но процесс одинаков для JTextPane ...

0

попробовать

package com.linkage.test; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

class ChangeEffect implements DocumentListener { 
    private String text; 
    @Override 
    public void insertUpdate(DocumentEvent de) { 
     int offset = de.getOffset(); 
     try { 
       String str = de.getDocument().getText(offset,de.getLength()); 
       text = de.getDocument().getText(0,offset + 1); 
       System.out.println("You entered the text: " + str); 
     }catch(Exception e){e.printStackTrace();} 
    } 
    @Override 
    public void changedUpdate(DocumentEvent de) { 
    } 
    @Override 
    public void removeUpdate(DocumentEvent event) { 
     try { 
      String str = text.substring(event.getOffset(),event.getOffset() + event.getLength()); 
      System.out.println("Removed text is: " + str); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 
+0

Это решение не работает для меня, содержимое текста обновляется до вызова removeUpdate, поэтому напечатанная строка неверна. Я работаю с Java 1.8 и Jython 2.7.0, поэтому я не тестировал чистую реализацию Java. – sgrieve

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