java记事本(附源代码)

        

      java记事本

本软件描述:

本软件是模拟Windows  XP的记事本功能,还扩展了一些功能,如改变字体的颜色,加上了,背景颜色,和插入图片的功能等,此软件作品还有很多的不足之处,还各位高手指点迷津,互相学习.本人联系方式(QQ):631818332

功能描述:

1、在文件菜单里面实现了新建文本编辑器,打开文件,保存文件,另存为文件,退出文本编辑器.功能

       2、在编辑菜单里面实现了撤销,恢复,剪切,复制,粘贴,删除,查找,查找下一个,替换,

        全选,时间/日期.功能

3、在格式菜单上实现了插入图片,改变字体,改变字体颜色,背景颜色,视图风格,增加下划线功能

       4、在查看菜单上实现了状态栏,字数统计功能

5、在帮助菜单中现了帮助主题,关干的功能.

一、          设计描述

类描述:

 /*********************主类******************/

public class TextEditor{ 

/**main()方法*/

 public static void main(String args[]) {

 new Note();  //实例化一个Note

 }

}

Note

是一个功能类

 public Note(){}  //构造方法

     /**addToolBar()方法用来设置工具条***/

private void addToolBar(int num,String label,String icon,ActionListener listen){}

/** 内部类fileAction,用来处理文件菜单事件 **/

public class fileAction implements ActionListener {}

/** 内部类editAction,用来处理编辑菜单事件 **/

public class editAction implements ActionListener {}

/** 内部类formatAction,用来处理格式菜单事件 **/

    public class formatAction implements ActionListener {}

/** 内部类viewAction,用来处理查看菜单事件 **/

public class viewAction implements ActionListener {}

/** 内部类helpAction,用来处理帮助菜单事件 **/

  public class helpAction implements ActionListener { } 

/** 内部类mouseAction,用来处理鼠标事件 **/

public class mouseAction extends MouseAdapter {}

/**内部类documentlis用来处理文档内容变化事件***/

public class documentlis implements DocumentListener{    }

    public void insertIcon(File file) { }        //插入图片的方法片     

    public void insertDoc(StyledDocument styledDoc, String content,String currentStyle){}//插入风格字体

   public void createStyle(String style,StyledDocument doc,int size,boolean bold,boolean italic,Color color,String fontName){}//创建风格  

    public void  openFile(){}             //打开文件

    public void saveAsFile() { }        //另存为           

    public void saveFile(){ }           //保存       

    public void exitText(){  } //退出文本的相关操作

   其他类:

    /*********用干文件过滤的外部类***********/

class JavaFileFilter extends FileFilter { }

class TxtFileFilter extends FileFilter {}  

     /**FindDialog用来进行查找***/   

   public class FindDialog extends JDialog implements ActionListener{  }        

    /*******setupFont用来设置字体*********/

public class FontDialog extends JDialog implements ActionListener { }  

/**HelpTheme用来设置帮助主题**/

   public class HelpTheme extends JFrame implements ActionListener{ }  

遇到的难题与解决方案:

1.、怎么样读取文件内容和保存文件内容,运用java 文件操作。运用JFileChooser,

先取得文件路径.然后就运用FileReader来进行读取文件的内容,运用FileWriter来保存文档里面的内容..

2、  如何改变所选择字体的颜色和大小?运用StyleDocument,来先建立风格,然后再插入风格字体,每次改变的时候先移除风格,再进行相应的操作.

3、  如何实现模糊查找与替换?利用正则表达式,用到Pattern Matcher来解决问题

4、  怎么样能够快速的初始化窗口?解决方法就是通过把重复的代码写进一个方法里面来实现,做到了代码重用。

5、  怎么样知道文本的内容是否改变?通过实现设置一个标记变量。然后用实现DocumentListener这一个接口,在里面的方法中把变量设置为true。这个样子就可以通过这一个标记变量来看文本的内容是否改变了。

6、  怎么样能够快速的得到多种颜色?利用到JColorChooser来取得。

二、  总结  

做完这个作品做我学到了很多的知识,比如说的就是java的异常处理文件读取,保存、用到正则表达式来进行模糊查找要找的字符串、利用java中的swing包来手工制作图形用户界面与java中的事件处理、内部类和外部类的使用方法、代码重用的方法、菜单的使用方法和给菜单添加上快捷方式等。当做软件开发的时候就要不断的学习,从而获得更大的进步,在开发的过程中发现自己的不足,汲取别人的长处.多向别人请教.不要不懂装懂.

 

三、作者

                        桂林电子科技大学

                            06级 软件工程

                               陈剑龙

 

 

  1. package javadesign;
  2. import java.awt.*;
  3. import java.util.regex.*;
  4. import javax.swing.*;
  5. import javax.swing.event.DocumentEvent;
  6. import javax.swing.event.DocumentListener;
  7. import javax.swing.filechooser.FileFilter;
  8. import java.awt.event.*;
  9. import java.util.*;
  10. import java.io.*;
  11. import javax.swing.text.*;
  12. import javax.swing.undo.UndoManager;
  13. /*********************主类******************/
  14. public class TextEditor{
  15.     /**main()方法*/
  16.     public static void main(String args[]) {
  17.         new Note();
  18.     }
  19. }
  20. /*************************Note类******************/
  21. class Note {
  22.     private File currentFile=null;
  23.     private JFrame  frame=new JFrame("无标题 - 文字编辑");
  24.     private JMenuBar menuBar = new JMenuBar();  //菜单栏
  25.     private JMenu fileMenu = new JMenu("文件(F)");
  26.     private JMenu editMenu = new JMenu("编辑(E)");
  27.     private JMenu formatMenu = new JMenu("格式(O)");
  28.     private JMenu helpMenu = new JMenu("帮助(H)");
  29.     private JMenu viewMenu = new JMenu("查看(V)");
  30.     private JToolBar toolbar = new JToolBar(); //工具条
  31.     private JMenuItem undoItem,redoItem,findItem, findnextItem;
  32.     private JButton newButton,openButton,saveButton,deleteButton;
  33.     private JButton undoButton,redoButton,copyButton,cutButton,pasteButton;
  34.     private JRadioButtonMenuItem windows,metal,motif;
  35.     private ButtonGroup group=new ButtonGroup();
  36.     private StyledDocument styledDoc=new DefaultStyledDocument();
  37.     public  static JTextPane display;     //JTextPane对象
  38.     private JScrollPane scroll;
  39.     private JPopupMenu  popupmenu = new JPopupMenu();  //右键菜单
  40.     private Color color;
  41.     public static String font_name = "宋体";
  42.     public static int font_size = 20, font_type = Font.PLAIN;
  43.     public static int xp= 400, yp = 100;
  44.     private Container container=frame.getContentPane(); //获得内容面板
  45.     private  Document  doc ;
  46.     /** 添加撤消管理器 */
  47.     private  UndoManager undomang=new   UndoManager();
  48.     private  UIManager.LookAndFeelInfo looks[]= UIManager.getInstalledLookAndFeels(); //风格
  49.     private JLabel statusbar=new JLabel();
  50.     public static boolean selectflag=true;
  51.     private boolean bold,italic,change,newflag,exitflag,windowflag;
  52.     private boolean openflag;/
  53.     public Note() {
  54.         frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);   //窗口关闭时不自动处理
  55.         frame.setSize(500650);    //设置窗口的大小
  56.         frame.setIconImage(Toolkit.getDefaultToolkit().getImage("title.gif")); //给窗口加上图标
  57.         frame.setLocation(400100);       //设置窗口显示的位置
  58.         statusbar.setHorizontalAlignment(JLabel.RIGHT); //设置状态栏在右边显示信息
  59.         windows=new JRadioButtonMenuItem("系统风格",false); //风格按键初始化
  60.         motif=new JRadioButtonMenuItem("MOTIF风格",false);
  61.         metal=new JRadioButtonMenuItem("默认风格",true);
  62.         group.add(windows);  //这样能实现单选
  63.         group.add(motif);
  64.         group.add(metal);
  65.         display= new JTextPane(styledDoc);
  66.         styledDoc.addDocumentListener(new documentLis());//
  67.         doc=display.getDocument();
  68.         toolbar.setEnabled(false); //设置工具条为不要编辑
  69.         doc.addUndoableEditListener(undomang);    //添加事件监听
  70.         frame.addWindowListener(new WindowAdapter() {
  71.             public void windowClosing(WindowEvent e) {
  72.                 if(change) {
  73.                     windowflag=true;
  74.                     exitText();                                     
  75.                 } else  System.exit(0);                
  76.             }
  77.         });
  78.         fileMenu.setMnemonic(KeyEvent.VK_F);//添加相应的快捷方式
  79.         editMenu.setMnemonic(KeyEvent.VK_E);
  80.         formatMenu.setMnemonic(KeyEvent.VK_O);
  81.         helpMenu.setMnemonic(KeyEvent.VK_H);
  82.         viewMenu.setMnemonic(KeyEvent.VK_V);
  83.         container.setLayout(new BorderLayout()); //设置布局
  84.         container.add(display, "Center");
  85.         container.add(toolbar,"North");
  86.         container.add(statusbar,"South");
  87.         display.setFont(new Font("宋体", Font.PLAIN, 20));  //设置字体
  88.         scroll = new JScrollPane(display);      //给文档加上滚动条
  89.         container.add(scroll);
  90.         frame.setJMenuBar(menuBar);             //添加菜单栏
  91.         /** 生成监听器实例对象*/
  92.         ActionListener file = new fileAction();
  93.         ActionListener edit = new editAction();
  94.         ActionListener format = new formatAction();
  95.         ActionListener help = new helpAction();
  96.         MouseListener mouse = new mouseAction();
  97.         ActionListener view = new viewAction();
  98.         /**设置文件菜单*/
  99.         addMenuItem(KeyEvent.VK_N,0"文件""新建(N)"'N', file,fileMenu,true,"new.gif");
  100.         addMenuItem(KeyEvent.VK_O,1"文件""打开(O)..."'O', file,fileMenu,false,"open.gif");
  101.         addMenuItem(KeyEvent.VK_S,2"文件""保存(S)"'S', file ,fileMenu,false,"save.gif");
  102.         addMenuItem(KeyEvent.VK_A,3"文件""另存为(A)..."'0', file,fileMenu,false,null);
  103.         addMenuItem(KeyEvent.VK_X,4"文件""退出(X)"'0', file,fileMenu,false,null);
  104.         /**设置编辑菜单*/
  105.         addMenuItem(KeyEvent.VK_U,0"编辑""撤销(U)"'Z', edit,editMenu,true,"undo.gif");
  106.         addMenuItem(KeyEvent.VK_R,1"编辑""恢复(R)"'Y', edit,editMenu,false,"redo.gif");
  107.         addMenuItem(KeyEvent.VK_T,2"编辑""剪切(T)"'X', edit,editMenu,false,"cut.gif");
  108.         addMenuItem(KeyEvent.VK_C,3"编辑""复制(C)"'C', edit,editMenu,false,"copy.gif");
  109.         addMenuItem(KeyEvent.VK_P,4"编辑""粘贴(P)"'V', edit,editMenu,false,"paste.gif");
  110.         addMenuItem(KeyEvent.VK_L,5"编辑""删除(L)"'0', edit,editMenu,false,"delete.gif");
  111.         addMenuItem(KeyEvent.VK_F,6"编辑""查找(F)"'F', edit,editMenu,false,"find.gif");
  112.         addMenuItem(KeyEvent.VK_N,7"编辑""查找下一个(N)"'0', edit,editMenu,false,null);
  113.         addMenuItem(KeyEvent.VK_E,8"编辑""替换(E)"'Q', edit,editMenu,false,"change.gif");
  114.         addMenuItem(KeyEvent.VK_A,9,"编辑""全选(A)"'A', edit,editMenu,false,null);
  115.         addMenuItem(KeyEvent.VK_D,10,"编辑""时间/日期(D)"'0', edit,editMenu,false,null);
  116.         /**设置格式菜单*/
  117.         addMenuItem(KeyEvent.VK_W,0"格式""插入图片(W)"'0', format,formatMenu,true,null);
  118.         addMenuItem(KeyEvent.VK_F,1"格式""字体(F)"'0', format,formatMenu,false,null);
  119.         addMenuItem(KeyEvent.VK_C,2"格式""颜色(C)"'0', format,formatMenu,false,null);
  120.         addMenuItem(KeyEvent.VK_S,3,"格式","视图风格(S)",'0',format,formatMenu,false,null);
  121.         addMenuItem(KeyEvent.VK_U,4,"格式","下划线(U)",'0',format,formatMenu,false,null);
  122.         /**设置查看菜单*/           
  123.         addMenuItem(KeyEvent.VK_W,1"查看""字数统计(W)"'0', view,viewMenu,true,null);
  124.         /**设置帮助菜单*/
  125.         addMenuItem(KeyEvent.VK_H,0"帮助""帮助主题(H)"'0', help,helpMenu,true,"help.gif");
  126.         addMenuItem(KeyEvent.VK_A,1"帮助""关于(A)"'0', help,helpMenu,false,null);
  127.         /**设置右键菜单*/
  128.         addPopupMenu(KeyEvent.VK_U, "撤销(U)", mouse, edit);
  129.         addPopupMenu(KeyEvent.VK_R, "恢复(R)", mouse, edit);
  130.         addPopupMenu(KeyEvent.VK_T, "剪切(T)", mouse, edit);
  131.         addPopupMenu(KeyEvent.VK_C, "复制(C)", mouse, edit);
  132.         addPopupMenu(KeyEvent.VK_P, "粘贴(P)", mouse, edit);
  133.         addPopupMenu(KeyEvent.VK_L, "删除(L)", mouse, edit);
  134.         addPopupMenu(KeyEvent.VK_A, "全选(A)", mouse, edit);
  135.         addPopupMenu(KeyEvent.VK_D, "时间/日期(D)", mouse, edit);
  136.         /**设置工具条**/
  137.         addToolBar(0,"新建","new.gif",file);
  138.         addToolBar(1,"打开","open.gif",file);
  139.         addToolBar(2,"保存","save.gif",file);
  140.         addToolBar(3,"撤销","undo.gif",edit);
  141.         addToolBar(4,"恢复","redo.gif",edit);
  142.         addToolBar(5,"剪切","cut.gif",edit);
  143.         addToolBar(6,"复制","copy.gif",edit);
  144.         addToolBar(7,"粘贴","paste.gif",edit);
  145.         addToolBar(8,"删除","delete.gif",edit);
  146.         frame.setVisible(true);
  147.     }
  148.     /**addToolBar()方法用来设置工具条***/
  149.     private void addToolBar(int num,String label,String icon,ActionListener listen) {
  150.         JButton button=new JButton(new ImageIcon(icon));
  151.         button.setToolTipText(label);  //设置提示信息
  152.         toolbar.add(button);           //添加按键
  153.         button.addActionListener(listen);   //添加监听
  154.         toolbar.addSeparator();            //添加分隔条
  155.         switch(num){
  156.             case 0:newButton=button;break;
  157.             case 1:openButton=button;break;
  158.             case 2:saveButton=button;break;
  159.             case 3:undoButton=button;break;
  160.             case 4:redoButton=button;break;
  161.             case 5:cutButton=button;break;
  162.             case 6:copyButton=button;break;
  163.             case 7:pasteButton=button;break;
  164.             case 8:deleteButton=button;break;
  165.         }
  166.     }
  167.     /**addText()方法用来设置右键菜单*/
  168.     private void addPopupMenu(int num, String label, MouseListener listen1,ActionListener listen2) {
  169.         display.add(popupmenu);
  170.         JMenuItem menuItem = new JMenuItem(label);
  171.         menuItem.setMnemonic(num);
  172.         if (label.equals("剪切(T)") || label.equals("全选(A)"))
  173.             popupmenu.addSeparator();          //添加分隔条
  174.         popupmenu.add(menuItem);
  175.         display.addMouseListener(listen1);//注册监听器的接口MouseListener
  176.         menuItem.addActionListener(listen2);//注册监听器的接口ActionListener
  177.     }
  178.     /**addMenuItem()方法用来设置菜单*/
  179.     private void addMenuItem(int count,int num, String menulabel, String itemlabel,
  180.             char shortlabel, ActionListener listen,JMenu menu,boolean bool,String icon) {
  181.         JMenuItem menuItem;
  182.         if(bool) menuBar.add(menu);        
  183.         if(icon!=null){
  184.          menuItem = new JMenuItem(itemlabel,new ImageIcon(icon));
  185.         }
  186.         else  menuItem=new JMenuItem(itemlabel);
  187.         menuItem.setMnemonic(count);  //添加快捷方式
  188.         if (shortlabel != '0')
  189.             menuItem.setAccelerator(KeyStroke.getKeyStroke(shortlabel,KeyEvent.CTRL_MASK));//添加组合快捷键的操作
  190.         menuItem.addActionListener(listen);//注册监听器的接口ActionListener
  191.         /*设置文件*/
  192.         if (menulabel.equals("文件"))  {
  193.             fileMenu.add(menuItem);
  194.             if(num==3) fileMenu.addSeparator();
  195.         }
  196.         /*设置编辑*/
  197.         else if (menulabel.equals("编辑")) {
  198.             editMenu.add(menuItem);
  199.             switch (num) {
  200.                 case 0:undoItem = menuItem; //撤销
  201.                 undoItem.setEnabled(false);
  202.                 break;
  203.                 case 1: redoItem=menuItem;         //恢复
  204.                 redoItem.setEnabled(false);
  205.                 editMenu.addSeparator();break;
  206.                 case 5:                                                                         //删除
  207.                     menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
  208.                     editMenu.addSeparator(); break;
  209.                 case 6:findItem = menuItem;
  210.                 findItem.setEnabled(false);break;//查找
  211.                 case 7:findnextItem = menuItem;   //查找下一个
  212.                 findnextItem.setEnabled(false);
  213.                 menuItem.setAccelerator(KeyStroke.getKeyStroke("F3"));break;
  214.                 case 10:menuItem.setAccelerator(KeyStroke.getKeyStroke("F5")); //时间/日期
  215.             }
  216.         }
  217.         /*设置格式*/
  218.         else if (menulabel.equals("格式")) {
  219.             switch (num) {
  220.                 case 0:formatMenu.add(menuItem);     //插入
  221.                 formatMenu.addSeparator(); break;
  222.                 case 1:formatMenu.add(menuItem);break;     //字体
  223.                 case 2:JMenu colorMenu = new JMenu(itemlabel);   //颜色
  224.                 formatMenu.add(colorMenu);
  225.                 JMenuItem backColor = new JMenuItem("背景颜色(B)");
  226.                 JMenuItem fontColor = new JMenuItem("字体颜色(F)");                              
  227.                 colorMenu.add(backColor);
  228.                 colorMenu.addSeparator();
  229.                 colorMenu.add(fontColor);
  230.                 colorMenu.setMnemonic(KeyEvent.VK_C);
  231.                 backColor.setMnemonic(KeyEvent.VK_B);
  232.                 fontColor.setMnemonic(KeyEvent.VK_F);
  233.                 backColor.addActionListener(listen);//注册监听器的接口ActionListener
  234.                 fontColor.addActionListener(listen);//注册监听器的接口ActionListener
  235.                 break;
  236.                 case 3:                                 //视图风格
  237.                     JMenu styleMenu= new JMenu(itemlabel);
  238.                     styleMenu.setMnemonic(KeyEvent.VK_S);
  239.                     formatMenu.add(styleMenu);
  240.                     styleMenu.add(metal);
  241.                     styleMenu.add(windows);
  242.                     styleMenu.add(motif);
  243.                     metal.addActionListener(listen);
  244.                     windows.addActionListener(listen);
  245.                     motif.addActionListener(listen);  break;
  246.                 case 4:formatMenu.add(menuItem);
  247.                 menuItem.setAction( new StyledEditorKit.UnderlineAction()); //添加加下划线侦听器
  248.                 menuItem.setText("下划线(U)");
  249.                 break;
  250.             }
  251.         }
  252.         /*设置查看*/
  253.         else if (menulabel.equals("查看")) {                          
  254.                 if(num==1)viewMenu.add(menuItem);   //字数统计            
  255.         }
  256.         /*设置帮助*/
  257.         else if (menulabel.equals("帮助")) {
  258.             helpMenu.add(menuItem);
  259.             if (num==0)
  260.                 helpMenu.addSeparator(); //帮助主题
  261.         }
  262.     }
  263.     /***************************************************************
  264.      *    Note类的内部类的相关操作
  265.      **************************************************************/
  266.     /** 内部类fileAction,用来处理文件菜单事件 **/
  267.     public class fileAction implements ActionListener {
  268.         //重写actionPerformed方法
  269.         public void actionPerformed(ActionEvent e) {
  270.             String command = e.getActionCommand();
  271.             if (command == "新建(N)"||e.getSource()==newButton) {
  272.                 if(change) {
  273.                     newflag=true;
  274.                     exitText();
  275.                     newflag=false;
  276.                 } else {
  277.                     frame.dispose();                 
  278.                     new Note();
  279.                 }
  280.             } else if (command == "打开(O)..."||e.getSource()==openButton)
  281.             {
  282.                if(change) {
  283.                    openflag=true;
  284.                     exitText();
  285.                     openflag=false;                    
  286.                 } else 
  287.                  openFile();
  288.             }
  289.             else if (command == "保存(S)"||e.getSource()==saveButton)
  290.                 saveFile();
  291.             else if (command == "另存为(A)...")
  292.                 saveAsFile();
  293.             else if (command == "退出(X)"){
  294.                 if(change) {
  295.                     exitflag=true;
  296.                     exitText();
  297.                     exitflag=false;
  298.                 } else   frame.dispose();
  299.             }
  300.         }
  301.     }
  302.     /** 内部类editAction,用来处理编辑菜单事件 **/
  303.     public class editAction implements ActionListener {
  304.         //  重写actionPerformed方法
  305.         public void actionPerformed(ActionEvent e) {
  306.             String command = e.getActionCommand();
  307.             if (command == "撤销(U)"||e.getSource()==undoButton) {                
  308.                 if(undomang.canUndo())
  309.                     undomang.undo();               
  310.                 redoItem.setEnabled(true);                
  311.             }else if(command=="恢复(R)"||e.getSource()==redoButton){                 
  312.                 if (undomang.canRedo())
  313.                     undomang.redo();
  314.                 else
  315.                     redoItem.setEnabled(false);                  
  316.             }else if (command == "剪切(T)"||e.getSource()==cutButton)
  317.                 display.cut();      //剪切所选的文本到剪贴板里
  318.             else if (command == "复制(C)"||e.getSource()==copyButton)
  319.                 display.copy();     //复制所选的文本放到剪贴板里
  320.             else if (command == "粘贴(P)"||e.getSource()==pasteButton)
  321.                 display.paste();    //取得剪贴板里的内容粘贴到display里
  322.             else if (command == "删除(L)"||e.getSource()==deleteButton)   //启动删除            
  323.                 display.replaceSelection("");                                     
  324.             else if (command == "查找(F)") {           //启动查找
  325.                 new FindDialog(frame,"查找",false);
  326.             }else if (command == "查找下一个(N)") {   //启动查找下一个
  327.                 if(selectflag)
  328.                     new FindDialog(frame,"查找",false);
  329.                 else if (FindDialog.matcher.find(Note.display.getCaretPosition()))    //使用find()方法查找第一个匹配的对象
  330.                     display.select(FindDialog.matcher.start(), FindDialog.matcher.start()+FindDialog.findText.getText().length());
  331.                 else
  332.                     JOptionPane.showMessageDialog(null,"找不到 /""+FindDialog.findText.getText()+"/"","文本编辑器",JOptionPane.WARNING_MESSAGE);
  333.             } else if (command == "替换(E)")              //开启替换对话框
  334.                 new ChangeDialog(frame,"替换",false);
  335.             else if (command == "全选(A)")            //全选
  336.                 display.selectAll();
  337.             else if (command == "时间/日期(D)") {
  338.                 Calendar now = Calendar.getInstance();//取得系统的时间
  339.                 int year = now.get(Calendar.YEAR);
  340.                 int month = now.get(Calendar.MONTH) + 1;
  341.                 int date = now.get(Calendar.DATE);
  342.                 int hour = now.get(Calendar.HOUR_OF_DAY);
  343.                 int minute = now.get(Calendar.MINUTE);
  344.                 display.replaceSelection(hour + ":" + minute + " " + year + "-" + month + "-"+ date);
  345.             }
  346.         }
  347.     }    
  348.     /** 内部类formatAction,用来处理格式菜单事件 **/
  349.     public class formatAction implements ActionListener {
  350.         //重写actionPerformed方法
  351.         public void actionPerformed(ActionEvent e) {
  352.             String command = e.getActionCommand();
  353.             if (command == "插入图片(W)") {
  354.                 JFileChooser open = new JFileChooser(); // 查找文件
  355.                  open.addChoosableFileFilter(new JpgFileFilter());
  356.                  open.addChoosableFileFilter(new GifFileFilter());
  357.                 int state=open.showOpenDialog(frame);
  358.                 File file=open.getSelectedFile();
  359.                 if(file!=null&&state==JFileChooser.APPROVE_OPTION)
  360.                 insertIcon(file); // 插入图片                    
  361.             }else if (command == "字体(F)") {
  362.                 xp= frame.getX();
  363.                 yp = frame.getY();
  364.                 FontDialog font=new FontDialog(frame,"字体",true);
  365.                 if(!font.sure)
  366.                     return;
  367.                 if(font_type==0){bold=false;italic=false;}
  368.                 else if(font_type==1){ bold=true;italic=false;}
  369.                 else if(font_type==2){ bold=false;italic=true;} 
  370.                 else {bold=true;italic=true;}
  371.                 if(display.getSelectedText()==null)
  372.                     display.setFont(font.myfont);
  373.                 else{
  374.                     createStyle("Style",styledDoc,font_size,bold,italic,display.getSelectedTextColor(),font_name);
  375.                     insertDoc(styledDoc,display.getSelectedText(),"Style");
  376.                 }
  377.             }else if (command == "背景颜色(B)") {
  378.                 color = JColorChooser.showDialog(container, "请选择背景颜色", color);
  379.                 if (color == null)
  380.                     color = display.getBackground();
  381.                 display.setBackground(color);
  382.                 
  383.             }else if (command == "字体颜色(F)") {
  384.                 color = JColorChooser.showDialog(container, "请选择字体颜色", color);
  385.                 if (color == null)
  386.                     color =Color.BLACK;
  387.                 if(display.getSelectedText()==null)
  388.                     display.setForeground(color);
  389.                 else{
  390.                     createStyle("style",styledDoc,font_size,bold,italic,color,font_name);
  391.                     insertDoc(styledDoc,display.getSelectedText(),"style");
  392.                 }
  393.             } else if(command=="MOTIF风格"){
  394.                 try {
  395.                     UIManager.setLookAndFeel(looks[1].getClassName());
  396.                     SwingUtilities.updateComponentTreeUI( frame );
  397.                 }catch ( Exception ea ) {}
  398.             }else if(command=="默认风格"){
  399.                 try {
  400.                     UIManager.setLookAndFeel(looks[0].getClassName());
  401.                     SwingUtilities.updateComponentTreeUI(frame);
  402.                 }catch ( Exception eb ) {}
  403.             }else if(command=="系统风格"){
  404.                 try {
  405.                     UIManager.setLookAndFeel(looks[3].getClassName());
  406.                     SwingUtilities.updateComponentTreeUI( frame );
  407.                 }catch ( Exception ea ) {}
  408.             }
  409.         }
  410.     }
  411.     /** 内部类viewAction,用来处理查看菜单事件 **/
  412.     public class viewAction implements ActionListener {
  413.         public void actionPerformed(ActionEvent e) {
  414.             String command = e.getActionCommand();
  415.             int length=0,blank=0,row=0,columns=1;
  416.             String space="",line="",text="",other="    ";
  417.             if(command=="字数统计(W)"){
  418.                 if (display.getSelectedText() == null)
  419.                     text=display.getText();
  420.                 else text=display.getSelectedText();
  421.                 length=text.length();
  422.                 for(int i=0;i<length;i++)
  423.                     if(text.charAt(i)==' ')  blank++; //比较字符是不是空格
  424.                     else if(String.valueOf(text.charAt(i)).equals("/n"))
  425.                         row++;
  426.                 for(int i=0;i<70;i++){
  427.                     space+=" ";
  428.                     if(i<50)
  429.                         line+="-";
  430.                 }
  431.                 String message="/n字数"+other+space+(length-2*row-blank)+
  432.                         "/n字符数"+space+(length-2*row)+
  433.                         "/n空格数"+space+blank+
  434.                         "/n行数"+other+space+(row+1);
  435.                 Object[] options = {"关闭"};
  436.                 JOptionPane.showOptionDialog(frame,"统计信息:"+line+message, "字数统计",
  437.                         JOptionPane.DEFAULT_OPTION,JOptionPane.CLOSED_OPTION,null, options,options[0]);
  438.             }
  439.         }
  440.     }
  441.     /** 内部类helpAction,用来处理帮助菜单事件 **/
  442.     public class helpAction implements ActionListener {
  443.         public void actionPerformed(ActionEvent e) {
  444.             String command=e.getActionCommand();
  445.             if(command=="关于(A)")
  446.                 new AboutDialog(frame,"关干 文本编辑器",true);
  447.             else if(command=="帮助主题(H)")
  448.                 new HelpTheme();
  449.         }
  450.     }
  451.     /** 内部类mouseAction,用来处理鼠标事件 **/
  452.     public class mouseAction extends MouseAdapter {
  453.         public void mouseReleased(MouseEvent e) {
  454.             if (e.isPopupTrigger())
  455.                 popupmenu.show(display, e.getX(), e.getY());//显示右键菜单
  456.         }
  457.     }
  458.     /**内部类documentlis用来处理文档内容变化事件***/
  459.     public class documentLis implements DocumentListener{
  460.         public void changedUpdate(DocumentEvent arg0) {           
  461.             change=true;                   
  462.         }
  463.         public void insertUpdate(DocumentEvent arg0) {          
  464.             change=true;
  465.             undoItem.setEnabled(true);
  466.             findItem.setEnabled(true);
  467.             findnextItem.setEnabled(true);                  
  468.         }
  469.         public void removeUpdate(DocumentEvent arg0) {           
  470.             change=true;            
  471.         }       
  472.     }
  473.     /***********************************************
  474.      * Note类里面的方法操作
  475.      * ****************************************************/   
  476.     public void insertIcon(File file) {          //插入图片的方法
  477.         display.setCaretPosition(styledDoc.getLength()); // 设置插入位置
  478.         display.insertIcon(new ImageIcon(file.getPath())); // 插入图片
  479.     }
  480.     public void insertDoc(StyledDocument styledDoc, String content,String currentStyle) {
  481.         try {
  482.             int len=display.getSelectedText().length();
  483.             styledDoc.insertString(display.getCaretPosition(),content,styledDoc.getStyle(currentStyle));
  484.             display.replaceSelection("");
  485.             display.select(display.getCaretPosition()-len,display.getCaretPosition());
  486.         } catch (Exception e) {}
  487.     }
  488.     public void createStyle(String style,StyledDocument doc,int size,boolean bold,boolean italic,Color color,String fontName) {
  489.         Style sys = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
  490.         try {
  491.             doc.removeStyle(style);
  492.         } catch(Exception e) {}  //先删除这种Style,假使他存在
  493.         Style s = doc.addStyle(style,sys); // 加入
  494.         StyleConstants.setFontSize(s,size); // 大小
  495.         StyleConstants.setBold(s,bold); // 粗体
  496.         StyleConstants.setItalic(s,italic); // 斜体
  497.         StyleConstants.setForeground(s,color); // 颜色
  498.         StyleConstants.setFontFamily(s,fontName);  // 字体
  499.     }
  500.     public void  openFile(){              //打开文件
  501.         JFileChooser open= new JFileChooser();
  502.         open.addChoosableFileFilter(new JavaFileFilter());
  503.         open.addChoosableFileFilter(new TxtFileFilter());
  504.         // 设置默认的文件管理器。如果不设置,则最后添加的文件过滤器为默认过滤器.这里设置为txtFilter
  505.         int state = open.showOpenDialog(frame);// 弹出文件选择窗口,点击确定返回一个整数
  506.         File file = open.getSelectedFile();
  507.         /*JFileChooser.APPROVE_OPTION常量存储着确定按钮对应的整数*/
  508.         if (file != null && state == JFileChooser.APPROVE_OPTION){
  509.             currentFile=file;                        
  510.             display.setText("");
  511.             frame.setTitle(file.getName()+" - 文字编辑");
  512.             try {
  513.                 FileReader readFile=new FileReader(file.getAbsolutePath());//文件的读取
  514.                 int len=(int)file.length();
  515.                 char []buffer=new char[len];
  516.                 readFile.read(buffer,0,len);
  517.                 display.setText(new String(buffer));
  518.                 readFile.close();
  519.             } catch (Exception e) { }
  520.              change=false;        //打开一个文件之后把文档内容变化标记变量设为false
  521.         }        
  522.     }
  523.     public void saveAsFile() {          //另存为
  524.         JFileChooser save=new  JFileChooser();
  525.         save.addChoosableFileFilter(new JavaFileFilter());
  526.         save.addChoosableFileFilter(new TxtFileFilter());
  527.         save.setDialogTitle("另存为");
  528.         int state = save.showSaveDialog(frame);
  529.         File file=save.getSelectedFile();                       
  530.         if (file != null && state == JFileChooser.APPROVE_OPTION){     
  531.              /**正则表达式用来查看输入的文件名是否有后缀名 */
  532.          Pattern pattern=Pattern.compile("//.//w*",Pattern.CASE_INSENSITIVE);      
  533.          Matcher matcher = pattern.matcher(file.getAbsolutePath()); 
  534.          if(!matcher.find()){             
  535.           file=new File(file.getAbsolutePath().concat(".txt")); 
  536.          }      
  537.             currentFile=file;                    
  538.             try {
  539.                 FileWriter target = new FileWriter(currentFile.getAbsolutePath());
  540.                 target.write(display.getText());
  541.                 frame.setTitle(currentFile.getName()+ " - 文字编辑");
  542.                 target.close();
  543.             } catch (Exception e) { }
  544.             change=false;
  545.         }        
  546.     }
  547.     public void saveFile(){            //保存
  548.         if (currentFile != null){
  549.             try{
  550.                 FileWriter file = new FileWriter(currentFile);
  551.                 file.write(display.getText());
  552.                 file.close();
  553.             }catch(Exception e){ }
  554.             change=false;
  555.         }else   saveAsFile();
  556.     }
  557.     public void exitText(){   //退出文本的相关操作
  558.         String path="无标题";
  559.         if(currentFile!=null)
  560.             path=currentFile.getAbsolutePath();
  561.         int num =JOptionPane.showConfirmDialog(container,"文件 "+ path +" 的文字已经改变。想要保存文件吗?""文字编辑",
  562.                 JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE);        
  563.         if(num==0) saveFile();       
  564.         else if(num==1&&newflag){frame.dispose();new Note();} 
  565.         else if(num==1&&exitflag){frame.dispose();} 
  566.         else if(num==1&&windowflag){System.exit(0);}
  567.         else if(num==1&&openflag) openFile();
  568.     }
  569. }
  570. /*********用干文件过滤的外部类***********/
  571. class GifFileFilter extends FileFilter{
  572.     public String getDescription(){
  573.         return "gif源文件(*.gif)";
  574.     }
  575.     public boolean accept(File file) {
  576.         return  file.getName().toLowerCase().endsWith(".gif");
  577.     }
  578. }
  579. class JpgFileFilter extends FileFilter{
  580.     public String getDescription(){
  581.         return "jpg源文件(*.jpg)";
  582.     }
  583.     public boolean accept(File file) {
  584.         return  file.getName().toLowerCase().endsWith(".jpg");
  585.     }
  586. }
  587. class JavaFileFilter extends FileFilter {
  588.     public String getDescription() {
  589.         return "java源文件(*.java)";
  590.     }
  591.     public boolean accept(File file) {
  592.         return file.getName().toLowerCase().endsWith(".java");
  593.     }
  594. }
  595. class TxtFileFilter extends FileFilter {
  596.     public String getDescription() {
  597.         return "文本文档(*.txt)";
  598.     }
  599.     public boolean accept(File file) {
  600.         return file.getName().toLowerCase().endsWith(".txt");
  601.     }
  602. }
  603. package javadesign;
  604. import java.awt.*;
  605. import java.awt.event.*;
  606. import java.util.regex.Matcher;
  607. import java.util.regex.Pattern;
  608. import javax.swing.*;
  609. import javax.swing.border.*;
  610. /*************************************************
  611.  * 类FindDialog用来进行查找
  612.  *
  613.  ***********************************************/
  614. public class FindDialog extends JDialog implements ActionListener{
  615.     private JLabel findLabel=new JLabel("输入要查找的内容:");
  616.     public static JTextField findText = new JTextField(15);
  617.     private JButton buttonNext = new JButton("查找下一个");
  618.     private ButtonGroup group=new ButtonGroup();
  619.     private JButton buttonCancel = new JButton("取消");
  620.     private JRadioButton findUp=new JRadioButton("向上",false);
  621.     private JRadioButton findDown=new JRadioButton("向下",true);
  622.     private JCheckBox letter=new JCheckBox("区分大小写",false);
  623.     private Container container=this.getContentPane();
  624.     private JPanel findPanel=new JPanel();
  625.     private JPanel buttonPanel=new JPanel();
  626.     private JPanel aspectPanel=new JPanel();
  627.     Pattern pattern ;
  628.     // 用Pattern类的matcher()方法生成一个Matcher对象
  629.     public static Matcher matcher ;
  630.     boolean begin=true ,letterflag=true,updownflag=false;
  631.     int judge=Pattern.CASE_INSENSITIVE; //区分大小写的值为1,不区别为2,此时judge=2
  632.     int startp,len,count=1;
  633.     
  634.     public FindDialog(Frame frame,String title,boolean modal){
  635.         super(frame,title,modal);
  636.         this.setSize(380150);
  637.         this.setResizable(false);
  638.         setLocation(Note.xp+ 50, Note.yp+ 150);
  639.         buttonNext.setEnabled(false);
  640.         findText.addKeyListener(new KeyAdapter() {
  641.             public void keyReleased(KeyEvent e) {
  642.                 if(findText.getText().length()!=0)
  643.                     buttonNext.setEnabled(true);
  644.                 else
  645.                     buttonNext.setEnabled(false);
  646.             }
  647.         });
  648.         group.add(findUp);
  649.         group.add(findDown);
  650.         container.setLayout(null);
  651.         findPanel.setLayout(new GridLayout(1,2));
  652.         buttonPanel.setLayout(new GridLayout(2,1,0,5));
  653.         aspectPanel.setLayout(new GridLayout(1,2));
  654.         findPanel.add(findLabel);
  655.         findPanel.add(findText);
  656.         buttonPanel.add(buttonNext);
  657.         buttonPanel.add(buttonCancel);
  658.         aspectPanel.add(findUp);
  659.         aspectPanel.add(findDown);
  660.         findPanel.setBounds(10,10,250,25);
  661.         buttonPanel.setBounds(265,10,100,50);
  662.         letter.setBounds(10,70,100,20);
  663.         aspectPanel.setBounds(120,50,140,50);
  664.         //建立类型为凸起的边框
  665.         Border border=BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
  666.         //建立边框式为border,标题为"方向"的TitledBorder
  667.         aspectPanel.setBorder(BorderFactory.createTitledBorder(border,"方向"));
  668.         container.add(findPanel);
  669.         container.add(buttonPanel);
  670.         container.add(letter);
  671.         container.add(aspectPanel);
  672.         buttonNext.addActionListener(this);
  673.         findUp.addActionListener(this);
  674.         findDown.addActionListener(this);
  675.         buttonCancel.addActionListener(this);
  676.         findText.addActionListener(this);
  677.         letter.addActionListener(this);
  678.         this.setVisible(true);
  679.     }
  680.     public void actionPerformed(ActionEvent e) {
  681.         if(e.getSource()==buttonNext||e.getSource()==findText) {
  682.             Note.selectflag=false;
  683.             switch(count) {
  684.                 case 0:String leave=Note.display.getText().substring(0,Note.display.getCaretPosition());
  685.                 if(leave.matches(findText.getText())||Note.display.getCaretPosition()-len<=0) {
  686.                     JOptionPane.showMessageDialog(null,"找不到 /""+findText.getText()+"/"","文本编辑器",JOptionPane.WARNING_MESSAGE);
  687.                     //Note.display.select(startp, startp+len);
  688.                     break;
  689.                 }
  690.                 Note.display.select(0, Note.display.getCaretPosition()-len);
  691.                 startp=Note.display.getSelectedText().lastIndexOf(findText.getText());
  692.                 len=findText.getText().length();
  693.                 Note.display.select(startp, startp+len);
  694.                 break;
  695.                 case 1:if(begin){
  696.                     try{
  697.                         Note.selectflag=false;
  698.                         //编译模式,参数findText.getText()表示输入的正则表达式,judge表示模式类型
  699.                         pattern=Pattern.compile(findText.getText(),judge);
  700.                         //获取匹配器,Note.display.getText()为待处理的字符串
  701.                         matcher = pattern.matcher(Note.display.getText());  //用Pattern类的matcher()方法生成一个Matcher对象
  702.                         begin=false;
  703.                     }catch(Exception ev){}
  704.                 }
  705.                 if (matcher.find(Note.display.getCaretPosition()))    //从光标处开始匹配模式
  706.                     Note.display.select(matcher.start(), matcher.end());
  707.                 else
  708.                     JOptionPane.showMessageDialog(null,"找不到 /""+findText.getText()+"/"","文本编辑器",JOptionPane.WARNING_MESSAGE);
  709.                 break;
  710.             }
  711.         } else if(e.getSource()==findUp)
  712.             count=0;
  713.         else if(e.getSource()==findDown){
  714.             begin=true;
  715.             count=1;
  716.         } else if(e.getSource()==buttonCancel)
  717.             this.setVisible(false);
  718.         else if(e.getSource()==letter) {
  719.             if(letterflag){judge=1;letterflag=false;} else {judge=2;letterflag=true;}
  720.             begin=true;
  721.         }
  722.     }
  723. }
  724. package javadesign;
  725. import java.awt.*;
  726. import java.awt.event.*;
  727. import javax.swing.*;
  728. public class AboutDialog extends JDialog {
  729.     
  730.     private JLabel iconLabel;  //用来放图片
  731.     private JTextArea word; //用来放说明
  732.     private JPanel panel;
  733.     private Container container;
  734.     private Note note=new Note();
  735.     
  736.     public AboutDialog(Frame frame,String title, boolean modal){
  737.         super(frame,title,modal);
  738.         this.setSize(415,400);
  739.         this.setLocation(Note.xp+50,Note.yp+150);
  740.         this.setResizable(false);
  741.         container=this.getContentPane();
  742.         iconLabel=new JLabel(new ImageIcon("top.gif"));
  743.         word=new JTextArea();
  744.         panel=new JPanel(new BorderLayout());
  745.         panel.add(iconLabel,"North");
  746.         panel.add(word,"Center");
  747.         container.setLayout(new BorderLayout());//设置布局
  748.         container.add(panel,"Center");
  749.         /**相关信息*/
  750.         String wordString="  Java编写的作品--/n" +
  751.                 "/t实现Windows记事本大部分功能/n"+
  752.                 "/t扩展了部分功能/n/n"+
  753.                 "  关干文本编辑器的制作者/n"+
  754.                 "/t学校:桂林电子科技大学/n"+
  755.                 "/t学院:  计算机与控制学院/n"+
  756.                 "/t专业:  软件工程/n"+
  757.                 "/t姓名:  陈剑龙/n"+
  758.                 "/t联系方式(QQ): 631818332";
  759.         Color backColor=new Color(200,255,255); //自定义颜色
  760.         word.setFont(new Font("宋体",Font.BOLD|Font.ITALIC,20)); //设置字体
  761.         word.setBackground(backColor);      //设置背景色
  762.         word.setForeground(Color.blue);    //设置前景色
  763.         word.setText(wordString);      //把wordstring放入到word组件里
  764.         word.setEditable(false);
  765.         this.setVisible(true);
  766.     }
  767. }
  768. package javadesign;
  769. import java.awt.*;
  770. import java.io.*;
  771. import javax.swing.*;
  772. import javax.swing.event.*;
  773. import javax.swing.tree.*;
  774. import java.awt.event.*;
  775. public class HelpTheme extends JFrame implements ActionListener{
  776.     Container container=this.getContentPane();
  777.     File currentFile;
  778.     JPanel indexpanel=new JPanel(new BorderLayout());
  779.     JPanel searchpanel=new JPanel(new BorderLayout());
  780.     JPanel listpanel=new JPanel(new BorderLayout());
  781.     JPanel rightpanel=new JPanel(new BorderLayout());
  782.     int leftX=275,leftY=225;
  783.     int rightpanelX=275,rightpanelY=225;
  784.     JToolBar toolbar=new JToolBar();
  785.     JButton indexshowbutton=new JButton("显示(D)");
  786.     JButton searchshowbutton=new JButton("显示(D)");
  787.     JButton searchthemebutton=new JButton("列出主题(L)");
  788.     JButton button=new JButton("隐藏");
  789.     JButton backbutton=new JButton("后退");
  790.     JButton forebutton=new JButton("前进");
  791.     JTextArea rightpanelarea=new JTextArea();
  792.     JTextField searchfield=new JTextField();
  793.     JTextField indexfield=new JTextField();
  794.     JTextField index=new JTextField("键入要查找的关键字(W):");
  795.     JTextField search=new JTextField("键入要查找的关键字(W):");
  796.     JTextField searchnext=new JTextField("选择要显示的主题(T):");
  797.     JList indexlist=new JList();
  798.     JList searchlist=new JList();
  799.     JScrollPane indexscroll=new JScrollPane(indexlist);
  800.     JScrollPane searchscroll=new JScrollPane(searchlist);
  801.     JSplitPane split;
  802.     boolean flag=true;
  803.     Box indexboxup=Box.createVerticalBox();                    //创建列型盒
  804.     Box indexboxdown=Box.createHorizontalBox();
  805.     Box searchboxup=Box.createVerticalBox();
  806.     Box searchboxcenter=Box.createHorizontalBox();
  807.     Box searchboxdown=Box.createHorizontalBox();
  808.     JTabbedPane lefttab=new JTabbedPane(JTabbedPane.TOP);
  809.     /*建立JTabbedPane对象,索引卡显示位置为上方*/
  810.     ///
  811.     DefaultMutableTreeNode node1,node2,node3;
  812.     DefaultMutableTreeNode root=new DefaultMutableTreeNode("文本编辑器");
  813.     JTree tree;
  814.     public HelpTheme() {
  815.         this.setTitle("帮助主题");
  816.         this.setLocation(400,200);       
  817.         indexboxup.add(Box.createVerticalStrut(8));
  818.         index.setEditable(false);
  819.         index.setFont(new Font("宋体",Font.BOLD,13));
  820.         index.setBackground(new Color(238,238,238));
  821.         indexboxup.add(index);
  822.         indexboxup.add(indexfield);
  823.         indexboxup.add(Box.createVerticalStrut(8));
  824.         indexpanel.add(indexboxup,"North");
  825.         indexpanel.add(indexscroll,"Center");
  826.         indexboxdown.add(Box.createHorizontalStrut(leftX-113));
  827.         indexboxdown.add(indexshowbutton);
  828.         indexpanel.add(indexboxdown,"South");       
  829.         searchboxup.add(Box.createVerticalStrut(8));
  830.         search.setEditable(false);
  831.         search.setFont(new Font("宋体",Font.BOLD,13));
  832.         search.setBackground(new Color(238,238,238));
  833.         searchboxup.add(search);
  834.         searchboxup.add(searchfield);
  835.         searchboxup.add(Box.createVerticalStrut(8));
  836.         searchboxcenter.add(Box.createHorizontalStrut(leftX-140));
  837.         searchboxcenter.add(searchthemebutton);
  838.         searchboxup.add(searchboxcenter);
  839.         searchboxup.add(Box.createVerticalStrut(8));
  840.         searchnext.setEditable(false);
  841.         searchnext.setFont(new Font("宋体",Font.BOLD,13));
  842.         searchnext.setBackground(new Color(238,238,238));
  843.         searchboxup.add(searchnext);
  844.         searchboxup.add(Box.createVerticalStrut(8));
  845.         searchpanel.add(searchboxup,"North");
  846.         searchpanel.add(searchscroll,"Center");
  847.         searchboxdown.add(Box.createHorizontalStrut(leftX-113));
  848.         searchboxdown.add(searchshowbutton);
  849.         searchpanel.add(searchboxdown,"South");        
  850.         lefttab.add("目录(C)",listpanel);
  851.         lefttab.add("索引(N)",indexpanel);
  852.         lefttab.add("搜索(S)",searchpanel);       
  853.         addTree("/"文本编辑器/"概述");
  854.         addTree("查找特定的字符或词");
  855.         addTree("查找并替换特定的字或词");
  856.         addTree("根据窗口大小换行");
  857.         addTree("转到特定行");
  858.         addTree("更改字形和大小");
  859.         addTree("在文档中插入时间和日期");
  860.         tree=new JTree(root);  //建立JTree对象tree
  861.         tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);//只能选取一个节点
  862.         tree.addMouseListener(new mouseAction());
  863.         listpanel.add(tree,"North");
  864.         ///
  865.         toolbar.add(button);
  866.         toolbar.addSeparator();
  867.         toolbar.addSeparator();
  868.         rightpanel.add(rightpanelarea);      
  869.         String string="/"文本编辑器概述/""+
  870.               "   在文件菜单里面实现了新建文本编辑器,打开文件,保存文件,另存为文件,退出文本编辑器.功能"+
  871.            "在编辑菜单里面实现了撤销,恢复,剪切,复制,粘贴,删除,查找,查找下一个,替换,"+
  872.                "全选,时间/日期.功能"+
  873.               "在格式菜单上实现了插入图片,改变字体,改变字体颜色,背景颜色,视图风格,增加下划线功能"+
  874.           "在查看菜单上实现了状态栏,字数统计功能"+
  875.               "在帮助菜单中现了帮助主题,关干的功能.";
  876.         rightpanelarea.setFont(new Font("楷体",Font.BOLD,25));
  877.         rightpanelarea.setText(string);        
  878.         toolbar.setEnabled(false);
  879.         rightpanelarea.setLineWrap(true);
  880.         //rightpanelarea.setEditable(false);
  881.         split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,false,lefttab,rightpanel);
  882.         /*设置split的分隔线位置,以像素为计算单位*/
  883.         split.setDividerLocation(leftX-30);
  884.              /*设置JSplitPane是否可以展开或收起(如同文件总管一般),设为true表示打开此功能。
  885.               */
  886.         //split.setOneTouchExpandable(true);
  887.         split.setDividerSize(10); //设置分隔线宽度的大小,以像素为计算单位。
  888.         container.add(split);
  889.         container.add(toolbar,"North");
  890.         this.setSize(leftX+rightpanelX,leftY+rightpanelY);
  891.         this.setVisible(true);
  892.         button.addActionListener(this);
  893.     }
  894.     
  895.     public void addTree(String string) {
  896.         DefaultMutableTreeNode node=new DefaultMutableTreeNode(string);
  897.         root.add(node);
  898.     }
  899.     /
  900.     class   mouseAction  extends   MouseAdapter {
  901.         public   void   mousePressed(MouseEvent   e)   {
  902.             int selRow=tree.getRowForLocation(e.getX(),e.getY());
  903.             System.out.println("选择了第几行"+selRow);
  904.             switch(selRow) {
  905.                 case 1:break;
  906.                 case 2:break;
  907.                 case 3:break;
  908.                 case 4:break;
  909.                 case 5:break;
  910.                 case 6:break;
  911.                 case 7:break;
  912.                 case 8:break;
  913.                 case 9:break;
  914.                 case 12:break;
  915.             }
  916.         }
  917.     }
  918.     public void actionPerformed(ActionEvent e) {
  919.         if(e.getSource()==button) {
  920.             if(flag){
  921.                 split.setDividerSize(0);
  922.                 lefttab.setVisible(false);
  923.                 button.setText("显示");
  924.                 this.setSize(rightpanelX+30,leftY+rightpanelY);
  925.                 this.setLocation(this.getX()+leftX-30,this.getY());
  926.                 flag=false;
  927.             } else {
  928.                 split.setDividerSize(10);
  929.                 lefttab.setVisible(true);
  930.                 button.setText("隐藏");
  931.                 split.setDividerLocation(leftX-30);
  932.                 this.setSize(leftX+rightpanelX,leftY+rightpanelY);
  933.                 this.setLocation(this.getX()-leftX+30,this.getY());
  934.                 flag=true;
  935.             }
  936.         }
  937.     }
  938. }
  939. package javadesign;
  940. import java.awt.*;
  941. import java.awt.event.*;
  942. import javax.swing.*;
  943. import javax.swing.border.*;
  944. /****************************************************************
  945.  *
  946.  *       类FontDialog用来设置字体
  947.  *
  948.  ********************************************************/
  949. public class FontDialog extends JDialog implements ActionListener {
  950.     private String font[];
  951.     private JLabel fontLabel, fontTypeLabel, fontSizeLabel, fontShowLabel;
  952.     private JList fontList, fontTypeList, fontSizeList;
  953.     private JTextField fontField, fontTypeField, fontSizeField,fontShowField;
  954.     private JScrollPane fontScroll, fontTypeScroll, fontSizeScroll;
  955.     public static JButton sureButton, cancelButton;
  956.     private JPanel panel = new JPanel();
  957.     public static Font myfont;
  958.     private Container container = getContentPane();
  959.     public FontDialog(Frame frame,String title, boolean modal){
  960.         super(frame,title,modal);
  961.         container.setLayout(null);
  962.         setLocation(Note.xp + 50, Note.yp + 150);
  963.         setResizable(false);
  964.         setSize(420300);
  965.         fontLabel = new JLabel("字体(F):");
  966.         fontField = new JTextField(Note.font_name);
  967.         GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();
  968.         font = g.getAvailableFontFamilyNames();//获得系统支持的所有字体列表
  969.         fontList = new JList(font);
  970.         fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 设为单选模式
  971.         fontScroll = new JScrollPane(fontList);
  972.         ///
  973.         fontTypeLabel = new JLabel("字形(Y):");
  974.         String[] data = { "常规""斜体""粗体""粗斜体" };
  975.         fontTypeList = new JList(data);
  976.         if (Note.font_type == 0)
  977.             fontTypeField = new JTextField("常规");
  978.         else if (Note.font_type == 1)
  979.             fontTypeField = new JTextField("粗体");
  980.         else if (Note.font_type == 2)
  981.             fontTypeField = new JTextField("斜体");
  982.         else  fontTypeField = new JTextField("粗斜体");
  983.         fontTypeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 设为单选模式
  984.         fontTypeScroll = new JScrollPane(fontTypeList);
  985.         ///
  986.         fontSizeLabel = new JLabel("大小(S):");
  987.         String size[] = new String[100];
  988.         for (int i = 10; i <= 100; i++) {
  989.             size[i - 10] = String.valueOf(i);
  990.         }
  991.         fontSizeList = new JList(size);
  992.         fontSizeField = new JTextField(""+Note.font_size);
  993.         fontSizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 设为单选模式
  994.         fontSizeScroll = new JScrollPane(fontSizeList);
  995.         /
  996.         sureButton = new JButton("确定");
  997.         cancelButton = new JButton("取消");
  998.         fontShowLabel = new JLabel("示例");
  999.         fontShowField = new JTextField("字体AaBbYy");
  1000.         Border inside = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
  1001.         fontShowField.setBorder(BorderFactory.createTitledBorder(inside));
  1002.         fontShowField.setEditable(false);
  1003.         fontShowField.setHorizontalAlignment(fontShowField.CENTER);
  1004.         fontShowField.setFont(myfont);
  1005.         fontLabel.setBounds(10516220);
  1006.         fontField.setBounds(102516220);
  1007.         fontScroll.setBounds(1045162140);
  1008.         fontTypeLabel.setBounds(177510020);
  1009.         fontTypeField.setBounds(1772510020);
  1010.         fontTypeScroll.setBounds(17745100140);
  1011.         fontSizeLabel.setBounds(28255020);
  1012.         fontSizeField.setBounds(282255020);
  1013.         fontSizeScroll.setBounds(2824550140);
  1014.         sureButton.setBounds(337256020);
  1015.         cancelButton.setBounds(337506020);
  1016.         fontShowLabel.setBounds(17719510020);
  1017.         fontShowField.setBounds(17721520045);
  1018.         /
  1019.         container.add(fontLabel);
  1020.         container.add(fontField);
  1021.         container.add(fontScroll);
  1022.         container.add(fontTypeLabel);
  1023.         container.add(fontTypeField);
  1024.         container.add(fontTypeScroll);
  1025.         container.add(fontSizeLabel);
  1026.         container.add(fontSizeField);
  1027.         container.add(fontSizeScroll);
  1028.         container.add(sureButton);
  1029.         container.add(cancelButton);
  1030.         container.add(fontShowLabel);
  1031.         container.add(fontShowField);
  1032.         
  1033.         MouseListener mouseListener = new MouseAdapter() {
  1034.             public void mouseClicked(MouseEvent e) {
  1035.                 mouseClick(e);
  1036.             }
  1037.         };
  1038.         fontList.addMouseListener(mouseListener);
  1039.         fontTypeList.addMouseListener(mouseListener);
  1040.         fontSizeList.addMouseListener(mouseListener);
  1041.         sureButton.addActionListener(this);
  1042.         cancelButton.addActionListener(this);
  1043.         this.setVisible(true);
  1044.     }
  1045.     public void mouseClick(MouseEvent e) {
  1046.         if (e.getSource() == fontList) {
  1047.             Note.font_name = fontList.getSelectedValue().toString();
  1048.             fontField.setText(Note.font_name);
  1049.         } else if (e.getSource() == fontTypeList)
  1050.             fontTypeField.setText(fontTypeList.getSelectedValue() .toString());
  1051.         else if (e.getSource() == fontSizeList) {
  1052.             fontSizeField.setText(fontSizeList.getSelectedValue().toString());
  1053.             Note.font_size= Integer.parseInt(fontSizeField.getText());
  1054.         }
  1055.         show_Font();
  1056.     }
  1057.     public void actionPerformed(ActionEvent e) {
  1058.         if (e.getSource() == sureButton)
  1059.             // Note.display.setFont(myfont);
  1060.             setVisible(false);
  1061.         else if (e.getSource() == cancelButton)
  1062.             setVisible(false);
  1063.     }
  1064.     public void show_Font() {
  1065.         if (fontTypeField.getText().equals("常规"))
  1066.             Note.font_type = 0;
  1067.         else if (fontTypeField.getText().equals("斜体"))
  1068.             Note.font_type = 2;
  1069.         else if (fontTypeField.getText().equals("粗体"))
  1070.             Note.font_type = 1;
  1071.         else if (fontTypeField.getText().equals("粗斜体"))
  1072.             Note.font_type = 3;
  1073.         myfont = new Font(Note.font_name, Note.font_type, Note.font_size);
  1074.         fontShowField.setFont(myfont);
  1075.     }
  1076. }
  1077. package javadesign;
  1078. import java.awt.*;
  1079. import javax.swing.*;
  1080. import java.awt.event.*;
  1081. import java.util.regex.*;
  1082. /*******************************************
  1083. * 利用ChangeDialog来替换
  1084. *******************************/
  1085. public class ChangeDialog extends JDialog implements ActionListener{
  1086.     private JLabel findLabel,changeLabel;
  1087.     private JTextField findField,changeField;
  1088.     private JCheckBox letter=new JCheckBox("区分大小写",false);
  1089.     private JButton findButton,changeButton,changeAllButton,cancelButton;
  1090.     private JPanel buttonPanel,textPanel;
  1091.     private Container container=this.getContentPane();     //获得内容面板
  1092.     Pattern pattern;
  1093.     // 用Pattern类的matcher()方法生成一个Matcher对象
  1094.     Matcher matcher ;
  1095.     boolean start=true,letterflag=true;
  1096.     int judge=Pattern.CASE_INSENSITIVE; //区分大小写的值为1,不区别为2,此时judge=2
  1097.     public   ChangeDialog(Frame frame,String title,boolean modal){
  1098.         super(frame,title,modal);   //调用父类的构造方法
  1099.         this.setSize(390,180);     //设置大小
  1100.         setLocation(Note.xp+ 50, Note.yp+ 150);//设置显示的位置
  1101.         this.setResizable(false);            //设置为不可最大化
  1102.         findLabel=new JLabel("输入原始字符:");
  1103.         changeLabel=new JLabel("输入替换字符:");
  1104.         findField=new JTextField(10);
  1105.         changeField=new JTextField(10);
  1106.         findButton=new JButton("查找下一个");
  1107.         changeButton=new JButton("替换");
  1108.         changeAllButton=new JButton("全部替换");
  1109.         cancelButton=new JButton("取消");
  1110.         buttonPanel=new JPanel();
  1111.         textPanel=new JPanel();
  1112.         buttonPanel.setLayout(new GridLayout(4,1,5,5));
  1113.         textPanel.setLayout(new GridLayout(2,2,5,5));
  1114.         textPanel.add(findLabel);
  1115.         textPanel.add(findField);
  1116.         textPanel.add(changeLabel);
  1117.         textPanel.add(changeField);
  1118.         buttonPanel.add(findButton);
  1119.         buttonPanel.add(changeButton);
  1120.         buttonPanel.add(changeAllButton);
  1121.         buttonPanel.add(cancelButton);
  1122.         container.setLayout(null);
  1123.         textPanel.setBounds(10,10,250,50);
  1124.         buttonPanel.setBounds(270,10,100,100);
  1125.         letter.setBounds(10,90,10020);
  1126.         container.add(textPanel);
  1127.         container.add(buttonPanel);
  1128.         container.add(letter);
  1129.         findButton.setEnabled(false);
  1130.         changeButton.setEnabled(false);
  1131.         changeAllButton.setEnabled(false);
  1132.         findField.addKeyListener(new KeyAdapter() {
  1133.             public void keyReleased(KeyEvent e) {
  1134.                 if(findField.getText().length()!=0) {
  1135.                     findButton.setEnabled(true);
  1136.                     changeButton.setEnabled(true);
  1137.                     changeAllButton.setEnabled(true);
  1138.                 } else {
  1139.                     findButton.setEnabled(false);
  1140.                     changeButton.setEnabled(false);
  1141.                     changeAllButton.setEnabled(false);
  1142.                 }
  1143.             }
  1144.         });
  1145.         findButton.addActionListener(this);
  1146.         cancelButton.addActionListener(this);
  1147.         findField.addActionListener(this);
  1148.         changeField.addActionListener(this);
  1149.         changeButton.addActionListener(this);
  1150.         changeAllButton.addActionListener(this);
  1151.         cancelButton.addActionListener(this);
  1152.         letter.addActionListener(this);
  1153.         this.setVisible(true);
  1154.     }
  1155.     public void findAndChange(){
  1156.         if(start){
  1157.             try{
  1158.                 pattern = Pattern.compile(findField.getText(),judge);
  1159.                 matcher = pattern.matcher(Note.display.getText());  //用Pattern类的matcher()方法生成一个Matcher对象
  1160.                 start=false;
  1161.             }catch(Exception ev){}
  1162.         }
  1163.         if (matcher.find(Note.display.getCaretPosition()))    //使用find()方法查找第一个匹配的对象
  1164.             Note.display.select(matcher.start(), matcher.end());
  1165.         else
  1166.             JOptionPane.showMessageDialog(null,"找不到 /""+findField.getText()+"/"","文本编辑器",JOptionPane.WARNING_MESSAGE);
  1167.         
  1168.     }
  1169.     public void actionPerformed(ActionEvent e) {
  1170.         if(e.getSource()==findButton||e.getSource()==findField) {
  1171.             findAndChange();
  1172.         }else if(e.getSource()==changeAllButton){
  1173.             Pattern pat = Pattern.compile(findField.getText(),judge);
  1174.             Matcher mat = pat.matcher(Note.display.getText()); //用Pattern类的matcher()方法生成一个Matcher对象
  1175.             Note.display.setText(mat.replaceAll(changeField.getText()));
  1176.         }else if(e.getSource()==cancelButton)
  1177.             this.setVisible(false);
  1178.         else if(e.getSource()==changeButton){
  1179.             if(Note.display.getSelectedText()!=null){
  1180.                 Note.display.replaceSelection(changeField.getText());
  1181.                 start=true;
  1182.             }
  1183.             findAndChange();
  1184.         }else if(e.getSource()==letter) {
  1185.             if(letterflag){judge=1;letterflag=false;} else {judge=2;letterflag=true;}
  1186.             start=true;
  1187.         }
  1188.     }
  1189. }
javawindows记事本源代码,具体功能如下: 1.文件(F) 可以通过点击菜单或快捷键(alt + F)打开菜单页 1.1新建(N) 菜单内点击或助记符N或快捷键(ctrl + N) 点击后弹出对话框,询问是否保存到***.txt? 点击保存(S):保存文本并关闭,再新建新的文本 点击不保存(N):不保存文本并关闭,再新建新的文本 点击取消:取消新建操作 1.2打开(O) 菜单内点击或助记符O或快捷键(ctrl + O) 点击后弹出对话框,询问是否保存到***.txt? 点击保存(S):保存文本,弹出选择文件对话框 点击不保存(N):不保存文本,弹出选择文件对话框 ==》选择文件对话框: 选择打开(O):就打开新的文本 选择取消:取消打开操作,返回原文本 点击取消:取消打开操作 1.3保存(S) 菜单内点击或助记符S或快捷键(ctrl + S) 点击后保存文本内容 1.4另存为(A) 菜单内点击或助记符A 点击后打开另存为对话框,选择路径和设置文件名 选择保存(S):就会在该路径保存文本,原文本内容不会保存并关闭,打开另存的文本 取消:取消另存为操作,返回原文本 1.5页面设置(U)(只实现页面边距,其他未实现) 菜单内点击或助记符U 点击后打开页面设置对话框:可以设置一下内容 纸张:大小(Z)、来源(S) 方向:纵向(O)、横向(A) 页面边距(毫米):左(L)右(R)上(T)下(B) 页眉(H)、页脚(F)、预览:(图片) 选择确定:保存新的页面设置 选择取消:取消页面设置 1.6打印(P)(改功能未完全实现,使用可能会报错) 菜单内点击或助记符P或快捷键(ctrl + P) 点击后弹出打印对话框 1.7退出(X) 菜单内点击或助记符X 点击后退出本文本文件 2.编辑(E) 可以通过点击菜单或快捷键(alt + E)打开菜单页 2.1撤销(U) 菜单内点击或助记符U或快捷键(ctrl + Z) 响应后返回上一步操作 2.2剪切(T) 菜单内点击或助记符T或快捷键(ctrl + X) 响应后光标选中的内容提取到剪贴板,并删除该内容,光标定位在元初识位置 2.3复制(C) 菜单内点击或助记符C或快捷键(ctrl + C) 响应后光标选中内容提取到剪贴板,光标位置保持不变 2.4粘贴(P) 菜单内点击或助记符P或快捷键(ctrl + V) 响应后光标选中的内容被替换为剪贴板的内容,光标选中刚刚粘贴的内容 2.5删除(L) 菜单内点击或助记符L或快捷键(DEL) 响应后删除光标选中的内容 2.6查找(F) 菜单内点击或助记符F或快捷键(ctrl + F) 响应后弹出查找对话框:输入查找的内容,可以选择区分大小和选择查找的方向 点击查找之后光标会选中响应的查找内容,没找到会弹出找不到对话框 2.7查找下一个(N) 菜单内点击或助记符N或快捷键(F3) 查找框有内容就直接查找贯标位置以后的内容,查找框没有内容直接弹出查找框 2.8替换(R) 菜单内点击或助记符R或快捷键(ctrl + H) 弹出替换对话框,有全部替换和替换当前两种 当前替换:替换光标选中的内容,光标移动到下一个查找内容上 2.9转到(G) 菜单内点击或助记符G或快捷键(ctrl + G) 在自动换行未选中的情况下,点击之后弹出转到指定行对话框 2.10全选(A) 菜单内点击或助记符A或快捷键(ctrl + A) 响应后选中全部文本内容 2.11时间/日期(D) 菜单内点击或助记符D或快捷键(F5) 在光标选中的内容里修改为当前时间 3.格式(O) 可以通过点击菜单或快捷键(alt + O)打开菜单页 3.1自动换行(W) 菜单内点击或助记符W 选中后,文本会自动换行,且不能点击查看状态栏和转到菜单 3.2字体(F) 菜单内点击或助记符F 弹出字体对话框:可以选择字体(F)、字形(Y)大小(S) 拥有示例和选择脚本,确定后更改全部字体 4.查看(V) 可以通过点击菜单或快捷键(alt + V)打开菜单页 4.1状态栏(S) 菜单内点击或助记符S 在底部会显示光标的起始坐标,第几行第几列 5.帮助(H) 可以通过点击菜单或快捷键(alt + H)打开菜单页 5.1查看帮助(H) 菜单内点击或助记符H 点击弹出帮助文本 5.2关于记事本(A)、 菜单内点击或助记符A 点击弹出关于记事本的对话框 显示它的版本信息
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值