功能不多,但作为一个记事本该有的功能都齐了。


import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.event.*;

public class Notepad extends WindowAdapter implements ActionListener,KeyListener,TextListener,DocumentListener,MouseListener{
JFrame frame;
JTextArea jta;
JScrollPane jsp; //创建滚动条
JMenuBar jmb;//菜单栏
JMenu menu1,menu2,editmenu;
JMenuItem mi1,mi2,mi3,mi4,micp,mipl,micut,miempty;
boolean ifopen = false,ifsave = false,ifchange = false,isSelectedText = false; 
File openfile = null;
JPopupMenu Popup;
String copytext = null;
public static void main(String[] args){
Notepad ntp = new Notepad();
ntp.CSwings();
}
public void CSwings(){ //创建各种Swing组件。
frame = new JFrame("My Notepad   -   记事本");
jta = new JTextArea(15,50);//创建一个15行50列的文本区。
jsp = new JScrollPane(jta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);//设置滚动条
jmb = new JMenuBar();
//创建菜单栏上两个子菜单。
menu1 = new JMenu("File");
menu2 = new JMenu("Help");
editmenu = new JMenu("Edit"); 
//菜单选项
mi1 = new JMenuItem("Open");
mi2 = new JMenuItem("Save");
mi3 = new JMenuItem("Exit");
mi4 = new JMenuItem("About");
micp = new JMenuItem("Copy"); 
mipl = new JMenuItem("Paste");
micut = new JMenuItem("Cut");
Popup = new JPopupMenu();
miempty = new JMenuItem("空方法");
mipl.setEnabled(false); //初始时剪贴板无内容,故粘贴选项为不可用状态。
setSwing();
}
public void setSwing(){
frame.setLayout(new BorderLayout());
jmb.add(menu1);
jmb.add(editmenu);
jmb.add(menu2);
menu1.add(mi1);
menu1.add(mi2);
menu1.addSeparator();
menu1.add(mi3);
menu2.add(mi4);
Popup.add(micp);
Popup.add(micut);
Popup.addSeparator();
Popup.add(mipl);
editmenu.add(miempty);
Container cp = frame.getContentPane();
cp.add(jmb,BorderLayout.NORTH ); //将菜单栏添加到frame中。
cp.add(jsp,BorderLayout.CENTER);     //将滚动条添加到frame中。
//注册监听程序
mi1.addActionListener(this);
mi2.addActionListener(this);
mi3.addActionListener(this);
mi4.addActionListener(this);
frame.addWindowListener(this);
jta.addKeyListener(this); 
jta.addMouseListener(this);
micp.addActionListener(this);
mipl.addActionListener(this);
micut.addActionListener(this);
fina();
}
public void fina(){
frame.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);
frame.setLocation(455,199);//设置窗口在屏幕上的显示位置。
frame.pack(); //为窗口设置一个自适应大小。
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e){
JMenuItem jmi = (JMenuItem)e.getSource();
if(jmi == mi1)   //单击菜单项中的Open项
OpenFile();
else if(jmi == mi2)//单击菜单项中的Save项
SaveFile();
else if(jmi == mi3)//单击菜单项中的Exit项
exit();
else if(jmi == mi4)//单击菜单项中的About项。
JOptionPane.showMessageDialog(frame,"版本号:V1.0 \n作者:杨永发 \nEmail:yang662886@foxmail.com","关于",
JOptionPane.INFORMATION_MESSAGE);
else if(jmi == micp)
Copy();
else if(jmi == mipl)
Paste();
else if(jmi == micut)
Cut();
}
public void Copy(){   //复制
copytext = jta.getSelectedText();
mipl.setEnabled(true);   //当剪贴板中有内容时paste即更改为可用状态。
}
public void Paste(){   //粘贴
if(copytext != null)   //当剪贴板中的内容不为空时即实现“粘贴功能”
jta.append(copytext);
else;
}
public void Cut(){   //剪切
copytext = jta.getSelectedText();
jta.cut(); //直接调用java提供的cut()方法。
mipl.setEnabled(true);
}

public void keyPressed(KeyEvent e) {   //给保存文本实现换行操作。
if(e.getKeyCode()==10){
jta.append("\r");   //添加换行符
} 
}
public void keyTyped(KeyEvent e){} //实现KeyListener接口中的方法。
public void keyReleased(KeyEvent e){}//实现KeyListener接口中的方法。
public void windowClosing(WindowEvent e){
if(!ifchange){
String sou = "";
sou = jta.getText();
if(!ifopen && !sou.equals("") && !ifsave){ //不是打开的文档,没保存,也不为空。
int len=JOptionPane.showConfirmDialog(frame,"文件未保存,是否保存");
    if(len==JOptionPane.NO_OPTION) //如果不保存文档,则直接退出。
    System.exit(0);
    else if(len==JOptionPane.YES_OPTION)
    SaveFile();
}
else
System.exit(0);
}
else
SecondSave();
}

public void OpenFile(){   //打开文件
openfile = null;
JFileChooser fc = new JFileChooser("E:\");
boolean ifequals = true;
do{
int select = fc.showOpenDialog(frame),count = 0;
ifequals = true;
if(select == 0){
openfile = fc.getSelectedFile();
frame.setTitle(openfile.getName() + " - 记事本");   //为窗口设置当前标题。
String strr = openfile.getName();
char ch[] = strr.toCharArray();//将所选文件名转换为char型数组以便后面检测该文件是否被支持。
char cha[]={1,2,3},txt[] = {'t','x','t'},ini[] = {'i','n','i'};
int len = ch.length;
 
//以下代码将检查所选择的文件是否是记事本所支持的。
cha[0] = ch[len-3];//保存所选 文件 后缀名。
cha[1] = ch[len-2];
cha[2] = ch[len-1];
for(int jj=0;jj<3;jj++){   //检测
if(cha[jj] !=txt[jj]) // 检测格式是否为txt
count++;
if(cha[jj] != ini[jj]) //检测格式是否为ini
count++;
if(count > 3)
ifequals = false;
}
count = 0;   //在为所选文件格式作出判断后给计数器count重新置0.
if(!ifequals){
Unsupported();
openfile = null;   //当所选文件格式不合法时,要使file指向为空,否则会出现隐患。
}
}
}while(!ifequals);

try{
FileReader fr = new FileReader(openfile);
BufferedReader br = new BufferedReader(fr);
String str;
while((str = br.readLine()) != null)
jta.setText(jta.getText()+str+"\n");   //累加显示。
 
br.close();
ifopen = true;   //至此,程序已成功打开了一份以txt 或 ini为后缀的文件。此变量置为true。
}
catch(Exception e){
JOptionPane.showMessageDialog(frame, "Filed opened!","Error",JOptionPane.ERROR_MESSAGE);
}
if(ifopen)
jta.getDocument().addDocumentListener(this);
}
public void changedUpdate(DocumentEvent e){}   //实现
public void insertUpdate(DocumentEvent e){ //当打开的文本中有数据插入时调用
ifchange = true;     //记录是否改变了文本数据。
}
public void removeUpdate(DocumentEvent e){
ifchange = true;     //记录是否改变了文本数据。
}

public void SaveFile(){   //保存文件
JFileChooser fc = new JFileChooser("E:\");
int select = fc.showSaveDialog(frame);
if(select == 0){
File file = fc.getSelectedFile();
try
  {
  FileWriter fw = new FileWriter(file);
  fw.write(jta.getText());   //输出数据到流。
  fw.close(); //关闭流
  ifsave = true;
  }
  catch(Exception e){
  JOptionPane.showMessageDialog(frame, "保存失败!","Error",JOptionPane.ERROR_MESSAGE);
  }
frame.setTitle(file.getName()); //保存成功以后,再设置窗体标题。
}
}
public void Unsupported(){
JOptionPane.showMessageDialog(frame, "不支持的文件类型,请重新选择!","An Error",JOptionPane.ERROR_MESSAGE);
}
public void exit(){
String sou;
sou = jta.getText();
if(ifopen && ifchange) //若文本内容被更改,则提示是否保存。
SecondSave();
else if(!ifsave && !sou.equals("")){
int choose = JOptionPane.showConfirmDialog(frame, "在关闭程序前是否保存该文档?");
if(choose == JOptionPane.YES_OPTION){
SaveFile();
System.exit(0);
}
else if(choose == JOptionPane.NO_OPTION)
System.exit(0);
}
else
System.exit(0);
}
public void SecondSave(){
int choose = JOptionPane.showConfirmDialog(frame, "是否保存改动后的文档?");
if(choose == JOptionPane.NO_OPTION)
System.exit(0);
else if(choose == JOptionPane.YES_OPTION){
try
  {
  FileWriter fw = new FileWriter(openfile);
  fw.write(jta.getText());   //输出数据到流。
  fw.close(); //关闭流
  System.exit(0);   // 保存成功后直接退出 。
  }
  catch(Exception ee){}
}
}

public void textValueChanged(TextEvent e){}
//调用弹出式菜单。
public void ShowPopup(MouseEvent e){
if(e.isPopupTrigger()){
Popup.show(e.getComponent(),e.getX(),e.getY());
}
}
//以下是实现MouseListener接口中的抽象方法。
public void mouseReleased(MouseEvent e){
ShowPopup(e);
}
public void mouseClicked(MouseEvent e){} 
public void mouseDragged(MouseEvent e){} 
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e) {}
public void mouseMoved(MouseEvent e){} 
public void mousePressed(MouseEvent e) {}
public void mouseWheelMoved(MouseWheelEvent e){} 
}