UndoableEditListener 和 DocumentListener

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.undo.*;
import javax.swing.text.*;

public class JTextAreaDemo3 extends JFrame implements UndoableEditListener,DocumentListener{
	
	private UndoableEdit edit;
	private JTextArea jta;
	private JMenuItem undoitem;
	private JMenuItem redoitem;
	private JTextArea message;
	
	public JTextAreaDemo3(){
		super("JTextAreaDemo3");
		jta = new JTextArea();
		jta.getDocument().addUndoableEditListener(this);
		jta.getDocument().addDocumentListener(this);
		message = new JTextArea();
		message.setEditable(false);
		
		JPanel p1 = new JPanel();
		p1.setLayout(new GridLayout(1,1));
		p1.setBorder(BorderFactory.createTitledBorder("Edit Area"));
		p1.add(new JScrollPane(jta));
		
		JPanel p2 = new JPanel();
		p2.setLayout(new GridLayout(1,1));
		p2.setBorder(BorderFactory.createTitledBorder("Message"));
		p2.add(new JScrollPane(message));
		
		this.getContentPane().setLayout(new GridLayout(2,1));
		this.getContentPane().add(p1);
		this.getContentPane().add(p2);
		
		JMenuBar bar = new JMenuBar();
		JMenu theMenu = new JMenu("Edit");
		undoitem = new JMenuItem("Undo");
		redoitem = new JMenuItem("Redo");
		theMenu.add(undoitem);
		theMenu.add(redoitem);
		bar.add(theMenu);
		updateMenuItem();//////////////
		
		this.setJMenuBar(bar);
		this.setSize(300,300);

		undoitem.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				edit.undo();
				updateMenuItem();
				message.append("-Undo-\n");
				
			}
		});
		
		redoitem.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				edit.redo();
				updateMenuItem();
				message.append("-Redo-\n");
			}
		});
		
	}
	
	@Override
	public void undoableEditHappened(UndoableEditEvent e){
		StringBuffer sb = new StringBuffer(200);
		edit = e.getEdit();
		//sb.append("undoableEdit");
		sb.append(edit.getPresentationName());
		sb.append("\n");
		message.append(sb.toString());
		updateMenuItem();
	}
	@Override
	public void changedUpdate(DocumentEvent e){
		showDE(e);
	}
	@Override
	public void insertUpdate(DocumentEvent e){
		showDE(e);
	}
	@Override
	public void removeUpdate(DocumentEvent e){
		showDE(e);
	}
	public void updateMenuItem(){
		if(edit!=null){
			undoitem.setEnabled(edit.canUndo());
			redoitem.setEnabled(edit.canRedo());
			undoitem.setText(edit.getUndoPresentationName());
			redoitem.setText(edit.getRedoPresentationName());
		}else{
			undoitem.setEnabled(false);
			redoitem.setEnabled(false);
			undoitem.setText("Undo");
			redoitem.setText("Redo");
		}
	}
	public void showDE(DocumentEvent e){
		StringBuffer sb = new StringBuffer(100);
		sb.append(e.getType());
		sb.append("Offset:");
		sb.append(e.getOffset());
		sb.append("Length:");
		sb.append(e.getLength());
		
		Element Eroot = jta.getDocument().getDefaultRootElement();
		DocumentEvent.ElementChange Echange = e.getChange(Eroot);
		if(Echange==null){
			sb.append("No Element Change");
			
		}else{
			sb.append("Element Chage:index");
			sb.append(Echange.getIndex());
		}
		sb.append("\n");
		message.append(sb.toString());
		
	}
	public static void main(String...args){
		JFrame jf = new JTextAreaDemo3();
		jf.setVisible(true);
		jf.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
	}
}


參考:深入淺出Java Swing程序設計

你可能感兴趣的:(swing)