获取JTextArea中突出显示文本的第一个和最后一个索引值

时间:2010-07-06 17:07:57

标签: java

我正在编写一个文本编辑器(在java中),我正在使用JTextArea进行主文本编辑,我将文本放入stringbuilder中。

当我突出显示文本并执行删除该文本块之类的操作时,我希望它在stringbuilder中更新。

所以我的问题是,有没有办法获得stringbuilder中突出显示文本的第一个和最后一个索引?

感谢。

2 个答案:

答案 0 :(得分:1)

如果删除JTextArea中的文本,是否只能在JTextArea上调用getText();来获取更新的文本?

我假设(在你的stringbuilder中)你保留了一条未被删除的字符串的记录。如果要保留已删除内容的记录,可以将原始JTextArea中的内容与更新后的内容进行比较,以找出已删除的内容。您可以通过查找原始版本和更新版本的不同之处以及之后匹配的位置来实现此目的。

答案 1 :(得分:1)

您可以使用DocumentListener将其保持同步,如下所示。但是,我强烈建议重新考虑你想要采取的任何方法。您似乎正在尝试使用外部StringBuilder作为JTextArea的“模型”,但文档 是模型。所以我没有看到这什么时候是个好主意。

public static void main(String[] args) {
    JTextArea area = new JTextArea();
    final StringBuilder builder = new StringBuilder();
    area.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent e) {
            builder.delete(e.getOffset(), e.getOffset() + e.getLength());
            System.out.println("Removed " + e.getLength() + " chars from SB");
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            try {
                builder.insert(e.getOffset(), 
                        e.getDocument().getText(e.getOffset(), e.getLength()));
                System.out.println("Inserted " + e.getLength() + " chars into SB.");
            } catch ( BadLocationException ble ) {
                ble.printStackTrace();
            }
        }

        @Override public void changedUpdate(DocumentEvent e) { /* no-op */ }
    });

    final JFrame frame = new JFrame("DocumentListener Test");
    frame.add(area);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            System.out.println("Final SB contents:");
            System.out.println(builder.toString());
        }
    });
    frame.pack(); frame.setVisible(true);
}