UndoableEditListenerとDocumentListener

4321 ワード


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-
"); } }); redoitem.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ edit.redo(); updateMenuItem(); message.append("-Redo-
"); } }); } @Override public void undoableEditHappened(UndoableEditEvent e){ StringBuffer sb = new StringBuffer(200); edit = e.getEdit(); //sb.append("undoableEdit"); sb.append(edit.getPresentationName()); sb.append("
"); 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("
"); 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プログラミングの詳細