Re: Problem with DocumentEvent.GetChange
On Jan 6, 5:23 am, "John B. Matthews" <nos...@nospam.com> wrote:
In article <4962335...@news.uni-rostock.de>,
Stefan Rybacki <noem...@noemail.foobar> wrote:
John B. Matthews schrieb:
...
<sscce>
> ...
</sscce>
This works for inserts but not for removes, though. Is there any way
to retrieve the actual removed part of the element this way?
Good point; no way that I can see. DocumentListener#removeUpdate() says,
"The range is given in terms of what the view last saw..."
<http://java.sun.com/javase/6/docs/api/javax/swing/event/DocumentListe...=
I would seem that a different handler for each DocumentEvent is warranted=
..
Even then, a changed child may go unreported:
<http://java.sun.com/javase/6/docs/api/javax/swing/event/DocumentEvent...=
Alas, there's no built-in version control.
--
John B. Matthews
trashgod at gmail dot comhttp://home.roadrunner.com/~jbmatthews/
Stefan has nailed the problem on the head - what happens with
removes? Your example, whilst much cleaner and neater than mine, has
removed the call to DocumentEvent.getChange(Element), which was what I
was trying to investigate (poorly) in the first place. My issue is
that getChange never returns anything except null - I tried with your
code as follows:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
public class MainJFrame extends JFrame {
private JTextPane editPane = new javax.swing.JTextPane();
private JScrollPane editScroll = new javax.swing.JScrollPane();
private JTextArea logArea = new javax.swing.JTextArea();
private JScrollPane logScroll = new javax.swing.JScrollPane();
public MainJFrame() {
initComponents();
addListener();
}
private void initComponents() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
editPane.setPreferredSize(new Dimension(0, 60));
editScroll.setViewportView(editPane);
logArea.setColumns(32);
logArea.setRows(24);
logScroll.setViewportView(logArea);
this.add(editScroll, BorderLayout.NORTH);
this.add(logScroll, BorderLayout.CENTER);
pack();
}
private void addListener() {
Document doc = editPane.getDocument();
doc.addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
logChange(e);
}
public void insertUpdate(DocumentEvent e) {
logChange(e);
}
public void removeUpdate(DocumentEvent e) {
logChange(e);
}
private void logChange(DocumentEvent e) {
StringBuilder s = new StringBuilder();
s.append(e.getType());
s.append(": ");
Document doc = e.getDocument();
try {
int offset = e.getOffset();
int length = e.getLength();
s.append(doc.getText(offset, length));
s.append(" at [");
s.append(offset);
s.append(",");
s.append(length);
s.append("]\n");
List<Element> eList = getAllElements(doc);
for (Element elem : eList) {
s.append("Found: ");
s.append(elem.getName());
if (e.getChange(elem) != null) {
s.append("Found!!");
}
s.append("\n");
}
} catch (Exception ex) {
logArea.append(ex.getMessage());
}
logArea.append(s.toString());
}
});
}
private List<Element> getAllElements(Document doc) {
List<Element> list = new ArrayList<Element>();
Element[] roots = doc.getRootElements();
for (Element root : roots) {
list.add(root);
getAllChildren(root, list);
}
return list;
}
private void getAllChildren(Element root, List<Element> list) {
for (int i = 0; i < root.getElementCount(); i++) {
list.add(root.getElement(i));
getAllChildren(root.getElement(i), list);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainJFrame().setVisible(true);
}
});
}
}