package Notepad;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.filechooser.FileFilter;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import javax.swing.undo.UndoManager;
import javax.swing.text.*;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;
public class NoteBook{
publicstatic void main(String []args){
new Notepad();
}
}
class Notepad extends JFrame implementsActionListener{
private JOptionPane jo;
private File currentFile =null;
private JTextArea jta;
private JScrollPane js;
private JMenuBar menubar;
private JMenumenu ;
private JMenu menuB ;
private JMenuItem New;
private JMenuItem open ;
private JMenuItem save ;
private JMenuItem exit ;
private JMenuItem saveas;
private JToolBar toolbar;//工具栏
private JMenuItem cut ;
private JMenuItem copy ;
private JMenuItem paste ;
private JMenuItem all ;
private JMenuItem back ;
private JToggleButtonbtnopen;
private JToggleButtonbtnnew;
private JToggleButtonbtnpaste;
private JToggleButtonbtncopy;
private JToggleButtonbtncut;
private JToggleButtonbtnsave;
private JToggleButtonbtnsaveas;
private UndoManager undomang;//定义一个撤销控件
private boolean change;
private boolean openflag;
private boolean newflag;
private boolean exitflag;
private booleanwindowflag;
private int num;
private Document doc;
Container cp;
public voidinit(){
undomang=new UndoManager();
menubar = new JMenuBar();//创建菜单栏
toolbar = new JToolBar();
menuB = new JMenu("编辑");
menu = new JMenu("文件");//创建菜单
New = new JMenuItem("新建",new ImageIcon("new.gif"));//创建子菜单
open = new JMenuItem("打开",new ImageIcon("open.gif"));
save= new JMenuItem("保存",new ImageIcon("save.gif"));
exit = new JMenuItem("退出");
saveas = new JMenuItem("另存为",new ImageIcon("save.gif"));
cut = new JMenuItem("剪切",new ImageIcon("cut.gif"));
copy = new JMenuItem("复制",new ImageIcon("copy.gif"));
paste = new JMenuItem("粘贴",new ImageIcon("paste.gif"));
back = new JMenuItem("撤销");
all = new JMenuItem("全选");
btnopen = new JToggleButton(new ImageIcon("open.gif"));
btnnew = new JToggleButton(new ImageIcon("new.gif"));
btncopy = new JToggleButton(new ImageIcon("copy.gif"));
btnpaste = new JToggleButton(new ImageIcon("paste.gif"));
btnsave = new JToggleButton(new ImageIcon("save.gif"));
btncut = new JToggleButton(new ImageIcon("cut.gif"));
btnsaveas = new JToggleButton(new ImageIcon("save.gif"));
jta = new JTextArea(30,50);
js = new JScrollPane(jta);//为JTextArea添加滚动条
doc = jta.getDocument();//获得文本中的内容
doc.addUndoableEditListener(undomang);//添加事件监听
menu.add(New);//向文件添加子菜单
menu.add(open);
menu.add(save);
menu.add(saveas);
menu.insertSeparator(3);//插入横线
menu.add(exit);
menuB.add(cut);
menuB.add(copy);
menuB.add(paste);
menuB.insertSeparator(3);
menuB.add(all);
menuB.add(back);
menubar.add(menu);
menubar.add(menuB);
toolbar.add(btnnew);
toolbar.add(btnopen);
toolbar.add(btnsave);
toolbar.add(btncut);
toolbar.add(btncopy);
toolbar.add(btnpaste);
toolbar.add(btnsaveas);
New.setActionCommand("新建");
open.setActionCommand("打开");
save.setActionCommand("保存");
exit.setActionCommand("退出");
saveas.setActionCommand("另存为");
cut.setActionCommand("剪切");
copy.setActionCommand("复制");
paste.setActionCommand("粘贴");
all.setActionCommand("全选");
back.setActionCommand("撤销");
New.addActionListener(this);
open.addActionListener(this);
save.addActionListener(this);
exit.addActionListener(this);
saveas.addActionListener(this);
cut.addActionListener(this);
copy.addActionListener(this);
paste.addActionListener(this);
all.addActionListener(this);
back.addActionListener(this);
btnopen.addActionListener(this);
btnsave.addActionListener(this);
btncut.addActionListener(this);
btncopy.addActionListener(this);
btnpaste.addActionListener(this);
btnnew.addActionListener(this);
btnsaveas.addActionListener(this);
menu.setMnemonic(KeyEvent.VK_E);//给文件菜单设置快捷键(要按住Alt键与赋给的值如E)
menuB.setMnemonic(KeyEvent.VK_F);
btnopen.setToolTipText("打开");//当鼠标移到按钮,显示提示
btnsave.setToolTipText("保存");
btncut.setToolTipText("剪切");
btncopy.setToolTipText("复制");
btnpaste.setToolTipText("粘贴");
btnsaveas.setToolTipText("另存为");
btnnew.setToolTipText("新建");
//给文件子菜单添加快捷键(其中CTRL_MASK可以用ALT_MASK)* 当是用CTRL——MASK
//要按住ctrl键和赋给值 而用ALT_MASK时就要按住Alt键与赋给的值如E
New.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));
open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,InputEvent.CTRL_MASK));
save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));
saveas.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
all.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,InputEvent.CTRL_MASK));
back.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.CTRL_MASK));
//判断文本是否已经发生改变
jta.getDocument().addDocumentListener(newDocumentListener(){
@Override//只是重写的标记,没有其他作用
public void changedUpdate(DocumentEvent e) {
change = true;
}
@Override
public void insertUpdate(DocumentEvent e) {
change = true;
}
@Override
public void removeUpdate(DocumentEvent e) {
change = true;
}
});
//安全退出程序即关闭窗口
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
if(change){
windowflag = true;
editText();
}
else
System.exit(0);
}
});
toolbar.addSeparator(new Dimension(1500,30));//给状态栏后面添加分隔符
cp = getContentPane();
cp.setLayout(new BorderLayout());
this.setJMenuBar(menubar);//向JFrame添加JMenuBar
cp.add(toolbar,BorderLayout.NORTH);
cp.add(js,BorderLayout.CENTER);
}
publicNotepad(){
super("【Waiyiung'sNotepad】");
init();
this.setSize(500,600);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicvoid actionPerformed(ActionEvent e){
if(e.getActionCommand()=="新建"||e.getSource()==btnnew){
if(change){
newflag =true;
editText();
newflag =false;
}
else{
this.dispose();//关闭窗体,释放资源
newNotepad();
}
}
if(e.getActionCommand()=="打开"||e.getSource()==btnopen){
if(change){
openflag =true;
editText();
openflag =false;
}
else
openFile();
}
if(e.getActionCommand()=="退出"){
if(change){
exitflag =true;
editText();
exitflag =false;
}
else
this.dispose();//释放当前的资源
}
if(e.getActionCommand()=="保存"||e.getSource()==btnsave){
saveFile();
}
if(e.getActionCommand()=="另存为"||e.getSource()==btnsaveas){
saveAsFile();
}
if(e.getActionCommand()=="复制"||e.getSource()==btncopy){
jta.copy();
}
if(e.getActionCommand()=="粘贴"||e.getSource()==btnpaste){
jta.paste();
}
if(e.getActionCommand()=="撤销"){
if(undomang.canUndo()){//判断文本是不是可以编辑
undomang.undo();//撤销编辑
}
}
if(e.getActionCommand()=="剪切"||e.getSource()==btncut){
jta.cut();
}
if(e.getActionCommand()=="全选"){
jta. selectAll();
}
}
//当文本发生改变,而又执行其它命令时弹出对话框提示
public void editText(){
String name = "";
if(currentFile!=null){
name =currentFile.getName();
}
num=JOptionPane.showConfirmDialog(cp,"文件"+ name +" 的文字已经改变,想要保存文件吗?", "Notepad",
JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE);
if(num==0)
saveAsFile();
elseif(num==1&&newflag){
this.dispose();
new Notepad();
}
elseif(num==1&&exitflag){
this.dispose();
}
elseif(num==1&&openflag)
openFile();
elseif(num==1&&windowflag)
System.exit(0);
}
public void openFile(){ //打开文件
JFileChooser open= new JFileChooser();//是打开文件一种的窗体
open.addChoosableFileFilter(newJavaFileFilter());//向可选择的文件过滤器列表添加一个过滤器
open.addChoosableFileFilter(new TxtFileFilter());
open.addChoosableFileFilter(new DocFileFilter());
// 设置默认的文件管理器。如果不设置,则最后添加的文件过滤器为默认过滤器.这里设置为txtFilter
int state = open.showOpenDialog(this);// 弹出文件选择窗口,点击确定返回一个整数
File file = open.getSelectedFile();//获得文件
if (file != null && state ==JFileChooser.APPROVE_OPTION){
currentFile=file;
try {
FileReader readFile=newFileReader(file.getAbsolutePath());//文件的读取
int len=(int)file.length();
char []buffer=new char[len];
readFile.read(buffer,0,len);
jta.append(new String(buffer));
readFile.close();//关闭读入流
} catch (Exception e) {
}
change=false; //打开一个文件之后把文档内容变化标记变量设为false
}
}
public voidsaveFile(){ //保存
if (currentFile != null){
try{
FileWriter file = new FileWriter(currentFile);
file.write(jta.getText());
file.close();
}catch(Exception e){ }
change=false;
}
else saveAsFile();
}
public void saveAsFile(){ //另存为
JFileChooser save=new JFileChooser();
save.addChoosableFileFilter(new JavaFileFilter());
save.addChoosableFileFilter(new TxtFileFilter());
save.setDialogTitle("另存为");
int state = save.showSaveDialog(this);
Filefile=save.getSelectedFile();
if (file != null && state ==JFileChooser.APPROVE_OPTION){
//正则表达式用来查看输入的文件名是否有后缀名
Pattern pattern=Pattern.compile("\\.\\w*",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(file.getAbsolutePath());
if(!matcher.find()){
file=new File(file.getAbsolutePath().concat(".txt"));
}
currentFile=file;
try {
FileWriter target = newFileWriter(currentFile.getAbsolutePath());
target.write(jta.getText());
target.close();
} catch (Exception e) { }
change=false;
}
}
}
class JavaFileFilter extends FileFilter {
public String getDescription() {
return "java源文件(*.java)";
}//对过滤器的描述
public boolean accept(File file) {
return file.getName().toLowerCase().endsWith(".java");
}//描述过滤器是否接受给定的文件(接受java文件)
}
class TxtFileFilter extendsFileFilter {
public String getDescription() {
return "文本文档(*.txt)";
}//对过滤器的描述
public boolean accept(File file) {
return file.getName().toLowerCase().endsWith(".txt");
}//描述过滤器是否接受给定的文件(过滤器接受txt文件)
}
class DocFileFilter extends FileFilter {
public String getDescription() {
return "Word 文档(*.doc)";
}//对过滤器的描述
public boolean accept(File file) {
return file.getName().toLowerCase().endsWith(".doc");
}//描述过滤器是否接受给定的文件(过滤器接受doc文件)
}