黑马程序员技术交流社区

标题: java笔记本一个小bug,和许多没有发现的bug,求高手解析 [打印本页]

作者: 王杰    时间: 2012-4-11 16:46
标题: java笔记本一个小bug,和许多没有发现的bug,求高手解析
本帖最后由 王杰 于 2012-4-11 16:50 编辑
  1. /*用java编写的一个类似Windows记事本的程序。现在已知有个bug,就是新打开的文件你没有修改,如果关闭文档的话,会有对话框提示你记事本已经改变,问你是否要保存,可是我并没有改变文档呀,就只是打开操作而已呀。*/

  2. package notepad;
  3. import java.io.*;
  4. import java.awt.*;
  5. import java.awt.event.*;

  6. public class MyNotepad
  7. {
  8. private Frame f;
  9. private MenuBar mbar;
  10. private Menu m1;
  11. private MenuItem exit;
  12. private MenuItem create;
  13. private MenuItem open;
  14. private MenuItem save;
  15. private MenuItem saveAs;
  16. private TextArea ta;

  17. private FileDialog saveDia,openDia,saveAsDia;

  18. private File file = null;
  19. private String dirPath = null;
  20. private String fileName = null;

  21. private String title = "MyNotepad - ";
  22. private String defaultName = "无标题.txt";

  23. private Dialog box;
  24. private Panel subbox;
  25. private Button OK;
  26. private Button NO;
  27. private Button back;
  28. private Label lab;

  29. private Dialog errorbox;
  30. private Panel suberrorbox;
  31. private Label lab2;
  32. private Button OK2;
  33. /*
  34. 自定义信号量:
  35. 如果textarea(文本域)内有更新,flag_update就设为ture;
  36.   每次打开、新建、另保存操作后,就设为false;
  37. 如果新建一个文档,flag_create 就设为ture;新建动作完成后设为false;
  38. 如果打开一个文档,flag_open 就设为ture;打开动作完成后设为false;
  39. 如果点击box内的取消(back),flag_back就设为ture;在判断完成后又将flag_设为false;
  40. ... ...
  41. */
  42. private boolean flag_update = false;
  43. private boolean flag_create = false;
  44. private boolean flag_open = false;
  45. private boolean flag_save = false;
  46. private boolean flag_no = false;
  47. private boolean flag_back = false;

  48. MyNotepad()
  49. {
  50.   init();
  51. }

  52. void init()
  53. {
  54.   saveDia = new FileDialog(f,"保存",FileDialog.SAVE);
  55.   saveAsDia = new FileDialog(f,"另存为",FileDialog.SAVE);
  56.   openDia = new FileDialog(f,"打开",FileDialog.LOAD);

  57.   f = new Frame(title + defaultName);
  58.   f.setBounds(400,200,540,420);

  59.   mbar = new MenuBar();

  60.   m1 = new Menu("文件");

  61.   exit = new MenuItem("退出");
  62.   saveAs = new MenuItem("另存为");
  63.   open = new MenuItem("打开   Ctrl+O");
  64.   save = new MenuItem("保存   Ctrl+S");
  65.   create = new MenuItem("新建   Ctrl+N");

  66.   ta = new TextArea();

  67.   f.setMenuBar(mbar);
  68.   f.add(ta);

  69.   mbar.add(m1);

  70.   m1.add(create);
  71.   m1.add(open);
  72.   m1.add(save);
  73.   m1.add(saveAs);
  74.   m1.addSeparator();
  75.   m1.add(exit);

  76.   box = new Dialog(f,"MyNotepad",true);
  77.   box.setBounds(480,300,250,150);
  78.   box.setLayout(new GridLayout(2,1));

  79.   subbox = new Panel(new FlowLayout());

  80.   lab = new Label();
  81.   OK = new Button("保存");
  82.   NO = new Button("不保存");
  83.   back = new Button("取消");
  84.   
  85.   box.add(lab);
  86.   box.add(subbox);

  87.   subbox.add(OK);
  88.   subbox.add(NO);
  89.   subbox.add(back);

  90.   errorbox = new Dialog(f,"MyNotepad - 提示",true);
  91.   errorbox.setLayout(new GridLayout(2,1));
  92.   errorbox.setBounds(480,300,250,150);
  93.   suberrorbox = new Panel(new FlowLayout());
  94.   
  95.   lab2 = new Label();
  96.   OK2 = new Button("确定");
  97.   
  98.   errorbox.add(lab2);
  99.   errorbox.add(suberrorbox);
  100.   suberrorbox.add(OK2);

  101.   noteEvent();//f里的监听器都封装在这里面;
  102.   boxEvent();//对话框里的监听器都封装在这里面。

  103.   f.setVisible(true);
  104. }

  105. //对话框监听器的封装函数

  106. void boxEvent()
  107. {
  108.   //对关闭对话框监听;
  109.   box.addWindowListener(new WindowAdapter()
  110.   {
  111.    public void windowClosing(WindowEvent e)
  112.    {
  113.     flag_back = true;
  114.     box.setVisible(false);
  115.    }
  116.   });
复制代码

作者: 王杰    时间: 2012-4-11 16:48
  1. errorbox.addWindowListener(new WindowAdapter()
  2.   {
  3.    public void windowClosing(WindowEvent e)
  4.    {
  5.     errorbox.setVisible(false);
  6.    }
  7.   });

  8. //对“取消”按钮监听

  9.   back.addActionListener(new ActionListener()
  10.   {
  11.    public void actionPerformed(ActionEvent e)
  12.    {
  13.     flag_back = true;
  14.     box.setVisible(false);
  15.    }
  16.   });

  17.   back.addKeyListener(new KeyAdapter()
  18.   {
  19.    public void keyPressed(KeyEvent e)
  20.    {
  21.     if(e.getKeyCode()==KeyEvent.VK_ENTER)
  22.     {
  23.      flag_back = true;
  24.      box.setVisible(false);
  25.     }     
  26.    }
  27.   });

  28. //对保存按钮监听;

  29.   OK.addActionListener(new ActionListener()
  30.   {
  31.    public void actionPerformed(ActionEvent e)
  32.    {
  33.     flag_save = true;
  34.     save(false);
  35.    }
  36.    
  37.   });

  38.   OK.addKeyListener(new KeyAdapter()
  39.   {
  40.    public void keyPressed(KeyEvent e)
  41.    {
  42.     if(e.getKeyCode()==KeyEvent.VK_ENTER)
  43.     {
  44.      flag_save = true;
  45.      save(false);
  46.     }   
  47.    }
  48.   });

  49. //对errorbox里的“确定”按钮监听

  50.   OK2.addActionListener(new ActionListener()
  51.   {
  52.    public void actionPerformed(ActionEvent e)
  53.    {
  54.     errorbox.setVisible(false);
  55.    }
  56.    
  57.   });

  58.   OK2.addKeyListener(new KeyAdapter()
  59.   {
  60.    public void keyPressed(KeyEvent e)
  61.    {
  62.     if(e.getKeyCode()==KeyEvent.VK_ENTER)
  63.      errorbox.setVisible(false);
  64.    }
  65.   });

  66. //对box里的不保存按钮监听;

  67.   NO.addActionListener(new ActionListener()
  68.   {
  69.    public void actionPerformed(ActionEvent e)
  70.    {
  71.     box.setVisible(false);
  72.     flag_no = true;
  73.     if(flag_create == true || flag_open == true)
  74.      return ;
  75.     System.exit(0);
  76.    }
  77.   });

  78.   NO.addKeyListener(new KeyAdapter()
  79.   {
  80.    public void keyPressed(KeyEvent e)
  81.    {
  82.     if(e.getKeyCode()==KeyEvent.VK_ENTER)
  83.     {
  84.      box.setVisible(false);
  85.      flag_no = true;
  86.      if(flag_create == true || flag_open == true)
  87.       return ;
  88.      System.exit(0);
  89.     }
  90.    }
  91.   });
  92. }

  93. //f的事件监听封装函数;

  94. void noteEvent()
  95. {

  96. //对关闭f监听;
  97.   f.addWindowListener(new WindowAdapter()
  98.   {
  99.    public void windowClosing(WindowEvent e)
  100.    {
  101.     if(flag_update == true)
  102.     {
  103.      message();
  104.      if(flag_back ==true)
  105.      {
  106.       flag_back = false;
  107.       box.setVisible(false);
  108.       return ;
  109.      }
  110.      if(flag_no == true)
  111.      {
  112.       flag_no = false;
  113.       System.exit(0);
  114.      }
  115.      if(flag_save == true)
  116.      {
  117.       flag_save = false;
  118.       if(fileName==null || dirPath==null)
  119.       {
  120.        return ;
  121.       }
  122.      }
  123.     }
  124.     System.exit(0);
  125.    }
  126.   });

  127. //对菜单里的“退出”监听

  128.   exit.addActionListener(new ActionListener()
  129.   {
  130.    public void actionPerformed(ActionEvent e)
  131.    {
  132.     if(flag_update == true)
  133.     {
  134.      message();
  135.      if(flag_back ==true)
  136.      {
  137.       flag_back = false;
  138.       return ;
  139.      }
  140.      if(flag_no == true)
  141.      {
  142.       flag_no = false;
  143.       System.exit(0);
  144.      }
  145.      if(flag_save == true)
  146.      {
  147.       flag_save = false;
  148.       if(fileName==null || dirPath==null)
  149.       {
  150.        return ;
  151.       }
  152.      }
  153.     }
  154.     System.exit(0);
  155.    }
  156.   });

  157. //对文本域进行改动监听;

  158.   ta.addTextListener(new TextListener()
  159.   {
  160.    public void textValueChanged(TextEvent e)
  161.    {
  162.     flag_update = true;
  163.    }
  164.   });

  165. //下面的都是对菜单里的item进行监听。并且设置了快捷键监听;

  166.   ta.addKeyListener(new KeyAdapter()
  167.   {
  168.    public void keyPressed(KeyEvent e)
  169.    {
  170.     int key = e.getKeyCode();
  171.     if(e.isControlDown() && key == KeyEvent.VK_N)
  172.     {
  173.      flag_create = true;
  174.      if(flag_update == true)
  175.      {
  176.       message();
  177.       if(flag_back == true)
  178.       {
  179.        flag_back = false;
  180.        return ;
  181.       }
  182.       if(flag_no == true)
  183.       {
  184.        flag_no = false;
  185.        create();
  186.        return ;
  187.       }
  188.       if(flag_save == true)
  189.       {
  190.        flag_save = false;
  191.        if(fileName==null || dirPath==null)
  192.        {
  193.         return ;
  194.        }
  195.       }
  196.      }
  197.      create();
  198.     }
  199.    }
  200.   });
复制代码

作者: 王杰    时间: 2012-4-11 16:48
  1.   ta.addKeyListener(new KeyAdapter()
  2.   {
  3.    public void keyPressed(KeyEvent e)
  4.    {
  5.     int key = e.getKeyCode();
  6.     if(e.isControlDown() && key==KeyEvent.VK_O)
  7.     {
  8.      flag_open = true;
  9.      if(flag_update == true)
  10.      {
  11.       message();
  12.       if(flag_back == true)
  13.       {
  14.        flag_back = false;
  15.        return ;
  16.       }
  17.       if(flag_no == true)
  18.       {
  19.        flag_no = false;
  20.        open();//调用已经封装好的打开操作;

  21.         //以下的message、save、saveAs、create等都是已经自定义封装好的。可以直接调用;
  22.        return ;
  23.       }
  24.       if(flag_save == true)
  25.       {
  26.        flag_save = false;
  27.        if(fileName==null || dirPath==null)
  28.        {
  29.         return ;
  30.        }
  31.       }
  32.      }  
  33.      open();
  34.     }   
  35.    }
  36.   });

  37.   ta.addKeyListener(new KeyAdapter()
  38.   {
  39.    public void keyPressed(KeyEvent e)
  40.    {
  41.     int key = e.getKeyCode();
  42.     if(e.isControlDown() && key==KeyEvent.VK_S)
  43.     {
  44.      save(true);
  45.     }
  46.    }
  47.   });

  48.   create.addActionListener(new ActionListener()
  49.   {
  50.    public void actionPerformed(ActionEvent e)
  51.    {
  52.     flag_create = true;
  53.     if(flag_update == true)
  54.     {
  55.      message();
  56.      if(flag_back == true)
  57.      {
  58.       flag_back = false;
  59.       return ;
  60.      }
  61.      if(flag_no == true)
  62.      {
  63.       flag_no = false;
  64.       create();
  65.       return ;
  66.      }
  67.      if(flag_save == true)
  68.      {
  69.       flag_save = false;
  70.       if(fileName==null || dirPath==null)
  71.       {
  72.        return ;
  73.       }
  74.      }
  75.     }
  76.     create();
  77.    }
  78.   });

  79.   open.addActionListener(new ActionListener()
  80.   {
  81.    public void actionPerformed(ActionEvent e)
  82.    {
  83.     flag_open = true;
  84.     if(flag_update==true)
  85.     {
  86.      message();
  87.      if(flag_back == true)
  88.      {
  89.       flag_back = false;
  90.       return ;
  91.      }
  92.      if(flag_no == true)
  93.      {
  94.       flag_no = false;
  95.       open();
  96.       return ;
  97.      }
  98.      if(flag_save == true)
  99.      {
  100.       flag_save = false;
  101.       if(fileName==null || dirPath==null)
  102.       {
  103.        return ;
  104.       }
  105.      }
  106.     }
  107.     open();
  108.    }
  109.   });

  110.   save.addActionListener(new ActionListener()
  111.   {
  112.    public void actionPerformed(ActionEvent e)
  113.    {
  114.     save(true);
  115.    }
  116.   });

  117.   saveAs.addActionListener(new ActionListener()
  118.   {
  119.    public void actionPerformed(ActionEvent e)
  120.    {
  121.     saveAs();
  122.    }
  123.    
  124.   });
  125. }

  126. //对保存操作进行封装;

  127. void save(boolean mode)
  128. {
  129.   if(file==null)
  130.   {
  131.    saveDia.setVisible(true);

  132.    dirPath = saveDia.getDirectory();
  133.    fileName = saveDia.getFile();

  134.    if(fileName==null || dirPath==null)
  135.    {
  136.     f.setTitle(title + defaultName);

  137.     if(mode)
  138.      return;
  139.     else
  140.     {
  141.      box.setVisible(false);
  142.      return;
  143.     }
  144.    }
  145.    
  146.    if(fileName.lastIndexOf(".")==-1)
  147.     fileName = fileName + ".txt";

  148.    f.setTitle(title + fileName);
  149.    
  150.    file = new File(dirPath,fileName);
  151.   }

  152.   BufferedWriter bfw = null;

  153.   try
  154.   {
  155.    bfw = new BufferedWriter(new FileWriter(file));
  156.    String text = ta.getText();
  157.    bfw.write(text);
  158.   }
  159.   catch (IOException e1)
  160.   {
  161.    throw new RuntimeException("文件保存失败");
  162.   }
  163.   finally
  164.   {
  165.    if(bfw!=null)
  166.    {
  167.     try
  168.     {
  169.      bfw.close();
  170.     }
  171.     catch (IOException e2)
  172.     {
  173.      throw new RuntimeException("资源关闭失败");
  174.     }
  175.    }
  176.   }

  177.   if(!mode)
  178.    box.setVisible(false);

  179.   flag_update = false ;
  180.   flag_create = false ;
  181.   flag_open = false ;
  182.   flag_save = false ;
  183. }

  184. void create()
  185. {
  186.   file = null;
  187.   fileName = null;
  188.   f.setTitle(title + defaultName);
  189.   ta.setText("");

  190.   flag_update = false ;
  191.   flag_create = false ;
  192.   flag_open = false ;
  193.   flag_save = false ;
  194. }

  195. //对另存为操作进行封装;

  196. void saveAs()
  197. {
  198.   saveAsDia.setVisible(true);

  199.   dirPath = saveAsDia.getDirectory();
  200.   fileName = saveAsDia.getFile();

  201.   if(fileName==null || dirPath==null)
  202.    return ;

  203.   if(fileName.lastIndexOf(".")==-1)
  204.     fileName = fileName + ".txt";

  205.   f.setTitle(title + fileName);
  206.    
  207.   file = new File(dirPath,fileName);

  208.   BufferedWriter bfw = null;
  209.   try
  210.   {
  211.    bfw = new BufferedWriter(new FileWriter(file));
  212.    String text = ta.getText();
  213.    bfw.write(text);
  214.   }
  215.   catch (IOException e1)
  216.   {
  217.    throw new RuntimeException("文件保存失败");
  218.   }
  219.   finally
  220.   {
  221.    if(bfw!=null)
  222.    {
  223.     try
  224.     {
  225.      bfw.close();
  226.     }
  227.     catch (IOException e2)
  228.     {
  229.      throw new RuntimeException("资源关闭失败");
  230.     }
  231.    }
  232.   }
  233.   flag_update = false ;
  234.   flag_create = false ;
  235.   flag_open = false ;
  236.   flag_save = false ;
  237. }

  238. //对打开操作进行封装;

  239. void open()
  240. {
  241.   openDia.setVisible(true);

  242.   dirPath = openDia.getDirectory();
  243.   fileName = openDia.getFile();

  244.   if(fileName==null || dirPath==null)
  245.    return ;

  246.   file = new File(dirPath,fileName);

  247.   if(!file.exists())
  248.   {
  249.    errorBox();
  250.    return ;
  251.   }  

  252.   f.setTitle(title + fileName);

  253.   ta.setText("");

  254.   BufferedReader bfr = null;
  255.   try
  256.   {
  257.    bfr = new BufferedReader(
  258.     new InputStreamReader(new FileInputStream(file),"GB2312"));
  259.    String line = null;
  260.    while((line = bfr.readLine())!= null)
  261.    {
  262.     ta.append(line+"\r\n");
  263.    }
  264.   }
  265.   catch (IOException ioe1)
  266.   {
  267.    throw new RuntimeException("文件打开失败");
  268.   }
  269.   finally
  270.   {
  271.    if(bfr!=null)
  272.    {
  273.     try
  274.     {
  275.      bfr.close();
  276.     }
  277.     catch (IOException ioe2)
  278.     {
  279.      throw new RuntimeException("资源关闭失败");
  280.     }
  281.    }
  282.   }

  283.   flag_open = false ;
  284.   flag_update = false ;
  285.   flag_create = false ;
  286.   flag_save = false ;
  287. }

  288. //封装了对话框;

  289. void message()
  290. {
  291.   String text = null;
  292.   if(fileName == null)
  293.    text = "文件 无标题.txt 已经改变,需要保存吗?";
  294.   else
  295.    text = "文件 " + fileName + " 已经改变,需要保存吗?";
  296.   lab.setText(text);
  297.   box.setVisible(true);
  298. }
  299. //封装了提示框
  300. void errorBox()
  301. {
  302.   lab2.setText("你要找的文件"+fileName+"没有找到!");
  303.   errorbox.setVisible(true);
  304. }

  305. //主函数调用;
  306. public static void main(String[] args)
  307. {
  308.   new MyNotepad();
  309. }
  310. }
复制代码

作者: 王杰    时间: 2012-4-16 09:18
自己顶一下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2