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程序設計
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值