当前位置: 首页 > 知识库问答 >
问题:

在JTextPane中查找删除的文本

侯池暝
2023-03-14
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语句中的消息)。
有没有办法从文档中得到最近删除的文本?

共有1个答案

太叔小云
2023-03-14

尝试使用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...

 类似资料:
  • 我现在正在读一本关于从二叉搜索树中删除节点的书,书中描述的过程对我来说似乎不必要地复杂。 在1号情况下,如果我们删除40,它将替换为30;在 2 号情况下,如果我们删除 40,它将被替换 35。 但在书中,它说应该从要删除的节点的右子树中找到替换,这可能涉及一些复杂的操作。 我在这里遗漏了什么吗?请指出。

  • 问题内容: 我面临一个问题:删除文档后,我可以立即找到该文档。 但是,当我等待几秒钟时,删除的文档就消失了,并且无法使用同一命令找到该文档。 实际上,我知道发布新文档时会有类似的情况,您需要等待一段时间才能找到它。我认为这对我来说是可以接受的。但是关于这种情况,有什么想法吗? 这是可重现的要点:https : //gist.github.com/hxuanji/89813ffe0979f12dba

  • 问题内容: 我正在编写一个小程序,该程序创建目录中所有文件的索引。它基本上遍历磁盘上的每个文件,并将其存储到可搜索的数据库中,就像Unix的locate。问题是,由于我有大约一百万个文件,因此索引生成非常慢。 一旦生成索引,是否可以快速找到自上次运行以来已在磁盘上添加或删除了哪些文件? 编辑 :我不想监视文件系统事件。我认为风险太高而无法同步,我更喜欢进行快速重新扫描之类的操作,以快速找到添加/删

  • 问题内容: 我想删除7天以上的文件和文件夹,所以我尝试了 因此,当我运行它时,它不会显示任何目录,但在子目录中却显示了几个文件。 在一个特定目录中删除7天以上的文件/文件夹的正确方法是什么? 问题答案: 您可以利用这段代码 说明 第一个参数是文件的路径。如上例所示,它可以是路径,目录或通配符。我建议使用完整路径,并确保在不执行exec的情况下运行命令,以确保获得正确的结果。 第二个参数-mtime

  • 我有一个JTextPane组件,我试图将用户键入的文本样式设置为同时下划线和删除线。 应该将下一个类型化字符的删除线属性设置为true的相关代码片段如下: 这确实会将文本样式设置为删除线,但如果已经将其样式设置为下划线,则会丢失下划线样式信息。仔细查看styleConstants.setStrikeThrough(...)背后的实际代码我注意到,下划线和删除线属性的CSS样式标记都是相同的(即“t

  • 我想在我的项目中找到未使用的依赖项。Gradle中有没有类似Maven的功能?