问题描述
我正在编写一个文本编辑器(在Java中),在这里我使用JTextArea进行主要文本编辑,并将文本放入stringbuilder中。
当我突出显示文本并执行诸如删除该文本块之类的操作时,我希望它在stringbuilder中进行更新。
所以我的问题是,有没有办法在stringbuilder中获取突出显示的文本的第一个和最后一个索引?
谢谢。
1楼
如果删除JTextArea中的文本,就不能只调用getText();
在您的JTextArea上以获取更新的文本?
我假设(在您的stringbuilder中)保留着未被删除的字符串的记录。 如果要保留删除内容的记录,可以将JTextArea中的原始内容与更新后的内容进行比较,以找出删除的内容。 您可以通过找出原始版本和更新版本在哪个索引上不同以及之后在何处匹配来实现此目的。
2楼
您可以使用DocumentListener
使其保持同步,如下所示。
但是,我强烈建议您重新考虑您尝试采用的任何方法。
似乎您正在尝试使用外部StringBuilder作为JTextArea的“模型”,但是Document 是模型。
所以我看不出什么时候是个好主意。
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);
}