2

JTextPaneを使用して Java でDocumentListenerについて学習しています。textpane で最近挿入/削除された現在の文字列または 単語 (テキスト)を取得しようとしています。私はこれを試しました:

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

2 に答える 2

3

DocumentFilterの代わりにa を使用してみてください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...の場合も同じです。

于 2013-10-07T05:43:55.477 に答える
-1

試す

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();
         }
    }

}
于 2013-10-07T05:29:18.920 に答える