您的位置:首页 > 编程语言 > Java开发

Java应用技巧——文本撤销、恢复功能的实现

2010-01-03 15:01 746 查看
作文本编辑器的时候,撤销(undo)、恢复(redo)是必不可少的两个功能。实现这个功能,要用到javax.swing.undo包中的UndoManager类。

 

UndoManager类有如下常用方法:

 

boolean canUndo()  ——判断能否进行撤消操作,可以则返回true。

boolean canRedo()  ——判断能否进行恢复操作,可以则返回true。

void Undo()  ——进行撤消操作。

void Redo()  ——进行恢复操作。

 

但是,进行撤销、恢复操作前还应为撤销、恢复的对象注册侦听器。在文本编辑器中,对象就是文本。例如先声明两个对象:

 

JTextArea text = new JTextArea();

UndoManager undomg = new UndoManager();

 

接下来,为text添加侦听器:

 

text.getDocument().addUndoableEditListener(undomg);

 

这里要说名一下,之所以要写getDocument()是因为注册侦听器的对象是文本,不是文本框。addUndoableEditListener(undomg)的作用是为text的文本注册侦听器,该方法的原型是:

 

void addUndoableEditListener(UndoableEditListener listener) 

 

可以看出,该方法的参数应是一个UndoableEditListener接口类型的参数,而我们用的参数是UndoManager类型,这是因为UndoManager类已经实现了UndoableEditListener接口的缘故。

 

现在就可以进行撤销、恢复操作了。方法是:

 

undomg.Undo(); //撤销

undomg.Redo(); //恢复

 

但是这样不算完美,因为如果无法撤销或恢复,这两个语句就不会起任何作用。因此我们改用如下方法:

 

if(undomg.canUndo()) { //撤销

    undomg.Undo();

}

 

if(undomg.canRedo()) { //恢复

    undomg.Redo();

}

 

 

这样一来,文本编辑器的撤销、恢复功能很容易地就实现了。以下是一个例子:

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

class UndoDemo extends JFrame {

static JTextArea text = new JTextArea();
static JPanel pnl = new JPanel();
static JButton unbtn = new JButton("撤销");
static JButton rebtn = new JButton("恢复");
static UndoManager undomg = new UndoManager();

UndoDemo() {

super("撤销、恢复功能实例");
setVisible(true);
setSize(400,300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout(5,5));

pnl.setLayout(new FlowLayout(5));
pnl.add(unbtn);
pnl.add(rebtn);
add(pnl,BorderLayout.NORTH);
add(text,BorderLayout.CENTER);

text.getDocument().addUndoableEditListener(undomg);

unbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if(undomg.canUndo()) {
undomg.undo();
} else {
JOptionPane.showMessageDialog(null,"无法撤销","警告",JOptionPane.WARNING_MESSAGE);
}
}
});

rebtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if(undomg.canRedo()) {
undomg.redo();
} else {
JOptionPane.showMessageDialog(null,"无法恢复","警告",JOptionPane.WARNING_MESSAGE);
}
}
});
}

public static void main(String[] args) {
new UndoDemo();
}
}


运行效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息