基于Java实现的记事本

到山东找蓝翔

发布日期: 2021-07-24 18:34:23 浏览量: 89
评分:
star_border star_border star_border star_border star_border star_border star_border star_border star_border star_border
*转载请注明来自write-bug.com

摘 要

目前,很多新的技术领域都涉及到了 Java 语言,Java 语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,因此 Java 语言也是学习面向对象编程和网络编程的首选语言。此次课程设计主要通过编写一个简单的记事本程序使我们深入理解并实践在本课程中所学的有关数据结构中操控字符串的方式。此记事本程序,使用 Java 程序编写,能够进行输入文字操作,并具有新建文件,打开文件,保存文件,加解密文本文件,退出,复制,粘贴,剪切等功能。该程序主要用到了 Java swing 和事件监听等。

关键词:GUI、字符串、Java、DES

一、 绪论

1.1 引言

Java 语言程序设计是一门实践性很强的软件设计课程,是继 PASCAL 语言之后的又一门优秀的课程教学语言,并且是教学需要与实际应用相结合的一门语言。课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。通过这次课程设计可以将书本上的知识转换成实际的东西,做到学以制用。通过本次课程设计,可以帮助学生全面牢固地掌握课堂教学内容、培养学生的实践动手能力和分 Java 语言程序设计实际问题的能力,培养学生调查研究、查阅技术文献、资料的能力,培养学生良好的编程风格和优秀的程序设计技术。

在本程序设计中,因为需要开发的是记事本程序,规模较小,内容较少,所以选择了 Eclipse 开发工具。

1.2 目的

目前,很多新的技术领域都涉及到了 Java 语言,Java 语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,因此 Java 语言也是学习面向对象编程和网络编程的首选语言。按照教学培养计划要求,学生在学习完课本中指定课时的知识后,应安排一定课时的课程设计。其主要目的是使学生深入理解并实践在本课程中所学的有关 Java 程序设计方面的语言基础、异常处理、事件处理、小应用程序以及图形用户界面设计等。故此“记事本”应运而生。

记事本主要用于对文字进行简单编辑软件,通过自己对于 Java 的学习,通过使用 Eclipse 开发工具,编写出简单的记事本,从而提高自己对于 Java 知识的理解和运用。

1.3 课题意义

随着计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。当然对文本编辑操作仍然占据着重要地位,记事本是简单便捷的文本编辑器,可实现对文本编辑操作的基本功能。

二、 系统分析

2.1 可行性分析

2.1.1 技术可行性

随着互联网应用越来越丰富,我们也能见到很多各种各样的记事本用于记事。但是,一个可以用于加解密的记事本却还是很少。使用 Java Swing 来制作一个记事本,使用 IO 流进行操作,使用加密算法进行加密,也就成了可能。

2.1.2 经济可行性

开发本系统所用的人力、物力、技术、资金等的花费不大,所以今后获得的经济效益一定会大于开发成本。

2.1.3 操作可行性

本开发系统操作步骤简单,打开即用,加解密方便。

2.2 软件需求分析

2.2.1 功能需求

本程序要构建的记事本程序参照了 Windows 操作系统的记事本工具,菜单中有“文件”,“编辑”,“关于”三个主菜单:

  • “文件”有“新建”、“打开”、“保存”、“另存为”、“解密打开”、“加密保存”、“加密另存为”、“退出”,分别用于新建文件,打开文件,保存文件,解密打开文件,加密保存文件,退出

  • “编辑”中有“替换 | 查找”子菜单,用于替换或查找文本

  • “关于”菜单中有 “关于记事本”子菜单,用于介绍记事本程序的作者等信息

2.2.2 假定的约束

  • 开发软件运行的最短寿命不要低于 2 年,即须更新

  • 进行方案选择比较的期限不要超过 2 个月

  • 经费主要通过贷款以及广告商赞助,需要严格控制支出

  • 法律和政策方面的限制:主要侵权以及隐私等机密问题的传播控制

  • 必须在双核 CPU 频率大于 1.7GHZ,内存大于 512MB,硬盘空间必须要 500MB 以上的机子上安装运行

  • 可在 WINDOWS 以及 Linux 的系统环境下运行

  • 在 JDK 环境下进行开发设计

2.2.3 性能需求

系统响应时间要 <=10s;

2.2.4 安全需求

软件使用了 DES 算法作为加解密算法,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种。

2.2.5 运行需求

  • 带有 JDK 环境的系统

  • window/linux/unix 通用

三、 系统设计与实现

3.1 程序设计思路

在本程序中,设计了一个菜单栏和文本内容区。设计过程中用到了 JFrame,JScrollPane,JMenu,JMenuItem,JTextArea,JFileChooser 等。JMenu 用来制作菜单,菜单包括“文件”“编辑”“关于”。JTextArea 主要用来输入文本。

3.2 概要设计

3.2.1 模块设计

本应用软件是简单的记事本,其能实现文件的新建、打开、保存、另存为、加密保存、解密打开、退出;剪切、复制、粘贴、删除、全选、查找、替换。为实现这些功能,需要设置以下模块:

主模块

文件相关功能模块

文档编辑模块

菜单设计有如下的一般性原则

  • 按照系统的功能来组织菜单

  • 要选用广而浅的菜单树,而不是窄而深的菜单树

  • 根据菜单选项的含义进行分组;并且按一定的规则排序

  • 菜单选项的标题要力求文学简短、含义明确,并且最好以关键词开始

  • 常用选项要设置快捷键

3.2.2 系统模块结构图

如图所示,首先创建一个名为继承 JFrame 类作为最底层的容器。

构造一个类要做三件事情,分别是初始化容器、初始化组件、设置事件监听器。

3.2.3 系统流程描述

3.3 界面设计

3.3.1 主界面设计

具体实现代码如下:

  1. public Main() {
  2. setTitle("Java\u8BB0\u4E8B\u672C");
  3. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  4. setBounds(100 100 924 587);
  5. JMenuBar menuBar = new JMenuBar();
  6. setJMenuBar(menuBar);
  7. JMenu menu = new JMenu("\u6587\u4EF6");
  8. menuBar.add(menu);
  9. JMenuItem menuItem = new JMenuItem("\u65B0\u5EFA");
  10. menuItem.addMouseListener(new MouseAdapter() {
  11. @Override
  12. public void mousePressed(MouseEvent e) {
  13. path = null;
  14. textPane.setText("");
  15. }
  16. });
  17. menu.add(menuItem);
  18. JMenuItem menuItem_1 = new JMenuItem("\u6253\u5F00");
  19. menuItem_1.addMouseListener(new MouseAdapter() {
  20. @Override
  21. public void mousePressed(MouseEvent e) {
  22. open();
  23. }
  24. });
  25. menu.add(menuItem_1);
  26. JMenuItem menuItem_2 = new JMenuItem("\u4FDD\u5B58");
  27. menuItem_2.addMouseListener(new MouseAdapter() {
  28. @Override
  29. public void mousePressed(MouseEvent e) {
  30. save();
  31. }
  32. });
  33. menu.add(menuItem_2);
  34. JMenuItem menuItem_3 = new JMenuItem("\u53E6\u5B58\u4E3A");
  35. menuItem_3.addMouseListener(new MouseAdapter() {
  36. @Override
  37. public void mousePressed(MouseEvent e) {
  38. saveOther();
  39. }
  40. });
  41. menu.add(menuItem_3);
  42. JMenuItem menuItem_7 = new JMenuItem("\u89E3\u5BC6\u6253\u5F00");
  43. menuItem_7.addMouseListener(new MouseAdapter() {
  44. @Override
  45. public void mousePressed(MouseEvent e) {
  46. desOpen();
  47. }
  48. });
  49. menu.add(menuItem_7);
  50. JMenuItem menuItem_6 = new JMenuItem("\u52A0\u5BC6\u4FDD\u5B58");
  51. menuItem_6.addMouseListener(new MouseAdapter() {
  52. @Override
  53. public void mousePressed(MouseEvent e) {
  54. encSave();
  55. }
  56. });
  57. menu.add(menuItem_6);
  58. JMenuItem menuItem_8 = new JMenuItem("\u52A0\u5BC6\u53E6\u5B58\u4E3A");
  59. menuItem_8.addMouseListener(new MouseAdapter() {
  60. @Override
  61. public void mousePressed(MouseEvent e) {
  62. encSaveOther();
  63. }
  64. });
  65. menu.add(menuItem_8);
  66. JMenuItem menuItem_4 = new JMenuItem("\u9000\u51FA");
  67. menuItem_4.addMouseListener(new MouseAdapter() {
  68. @Override
  69. public void mousePressed(MouseEvent e) {
  70. System.exit(1);
  71. }
  72. });
  73. menu.add(menuItem_4);
  74. JMenu menu_1 = new JMenu("\u7F16\u8F91");
  75. menuBar.add(menu_1);
  76. JMenuItem menuItem_5 = new JMenuItem("\u66FF\u6362|\u67E5\u627E");
  77. menuItem_5.addMouseListener(new MouseAdapter() {
  78. @Override
  79. public void mousePressed(MouseEvent e) {
  80. new Replace(textPane);
  81. }
  82. });
  83. menu_1.add(menuItem_5);
  84. JMenu menu_2 = new JMenu("\u5173\u4E8E");
  85. menuBar.add(menu_2);
  86. JMenuItem menuItem_9 = new JMenuItem("\u5173\u4E8E\u8BB0\u4E8B\u672C");
  87. menuItem_9.addMouseListener(new MouseAdapter() {
  88. @Override
  89. public void mousePressed(MouseEvent e) {
  90. JOptionPane.showInternalMessageDialog(contentPane "made by 木子中""关于" JOptionPane.INFORMATION_MESSAGE);
  91. }
  92. });
  93. menu_2.add(menuItem_9);
  94. contentPane = new JPanel();
  95. contentPane.setBorder(new EmptyBorder(5 5 5 5));
  96. setContentPane(contentPane);
  97. contentPane.setLayout(null);
  98. JScrollPane scrollPane = new JScrollPane();
  99. scrollPane.setBounds(0 0 906 490);
  100. contentPane.add(scrollPane);
  101. textPane = new JTextPane();
  102. textPane.setFont(new Font("宋体" Font.PLAIN 23));
  103. scrollPane.setViewportView(textPane);
  104. JPopupMenu popupMenu = new JPopupMenu();
  105. addPopup(textPane popupMenu);
  106. JMenuItem menuItem_12 = new JMenuItem("\u526A\u5207");
  107. menuItem_12.addMouseListener(new MouseAdapter() {
  108. @Override
  109. public void mousePressed(MouseEvent e) {
  110. text = textPane.getSelectedText();
  111. textPane.replaceSelection("");
  112. }
  113. });
  114. popupMenu.add(menuItem_12);
  115. JMenuItem menuItem_11 = new JMenuItem("\u590D\u5236");
  116. menuItem_11.addMouseListener(new MouseAdapter() {
  117. @Override
  118. public void mousePressed(MouseEvent e) {
  119. text = textPane.getSelectedText();
  120. }
  121. });
  122. popupMenu.add(menuItem_11);
  123. JMenuItem menuItem_13 = new JMenuItem("\u7C98\u8D34");
  124. menuItem_13.addMouseListener(new MouseAdapter() {
  125. @Override
  126. public void mousePressed(MouseEvent e) {
  127. String s = textPane.getSelectedText();
  128. if(s == null) {
  129. int cur = textPane.getCaretPosition();
  130. // 得到光标之后的字符串
  131. String tailString = textPane.getText().substring(cur);
  132. // 得到光标之前的字符串
  133. String headString = textPane.getText().substring(0 cur);
  134. // 拼接字符串 并输出
  135. textPane.setText(headString + text + tailString);
  136. textPane.setCaretPosition(cur+text.length());
  137. } else {
  138. textPane.replaceSelection(text);
  139. }
  140. }
  141. });
  142. popupMenu.add(menuItem_13);
  143. JMenuItem menuItem_14 = new JMenuItem("\u5168\u9009");
  144. menuItem_14.addMouseListener(new MouseAdapter() {
  145. @Override
  146. public void mousePressed(MouseEvent e) {
  147. textPane.setSelectionStart(0);
  148. }
  149. });
  150. popupMenu.add(menuItem_14);
  151. lblNewLabel = new JLabel("None");
  152. lblNewLabel.setBounds(0 496 906 18);
  153. contentPane.add(lblNewLabel);
  154. }

3.3.2 统计情况设计

采用了线程的方法进行实时更新统计信息。

具体实现代码如下:

  1. public class CheckThread extends Thread {
  2. private JTextPane textPane;
  3. private JLabel label;
  4. public CheckThread(JTextPane textPane JLabel label) {
  5. this.textPane = textPane;
  6. this.label = label;
  7. }
  8. public void run() {
  9. while(true) {
  10. String str = textPane.getSelectedText();
  11. if(str == null) {
  12. str = textPane.getText();
  13. }
  14. int letter = 0;
  15. int num = 0;
  16. int space = 0;
  17. int chinese = 0;
  18. int point = 0;
  19. int total = 0;
  20. for(int i = 0; i < str.length(); i++) {
  21. char c = str.charAt(i);
  22. if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
  23. letter++;
  24. } else if(c >= '0' && c <= '9') {
  25. num++;
  26. } else if(c == ' ') {
  27. space++;
  28. } else if(c >= '\u4e00' && c <= '\u9fa5') {
  29. chinese++;
  30. } else {
  31. point++;
  32. }
  33. total++;
  34. }
  35. label.setText("字母:"+letter+" 数字:"+num+" 空格:"+space+" 汉字:"+chinese+" 符号:"+point+"总数:"+total);
  36. try {
  37. Thread.sleep(300);
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. }

3.3.3 查找替换设计

具体实现代码如下:

  1. public Replace(JTextPane textPane1) {
  2. this.textPane = textPane1;
  3. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  4. setBounds(100 100 551 235);
  5. contentPane = new JPanel();
  6. contentPane.setBorder(new EmptyBorder(5 5 5 5));
  7. setContentPane(contentPane);
  8. contentPane.setLayout(null);
  9. JLabel lblNewLabel = new JLabel("\u67E5\u627E\u7684\u6587\u672C");
  10. lblNewLabel.setBounds(25 40 90 18);
  11. contentPane.add(lblNewLabel);
  12. textField = new JTextField();
  13. textField.setBounds(114 29 229 40);
  14. contentPane.add(textField);
  15. textField.setColumns(10);
  16. JLabel label = new JLabel("\u66FF\u4EE3\u7684\u6587\u672C");
  17. label.setBounds(25 93 90 18);
  18. contentPane.add(label);
  19. textField_1 = new JTextField();
  20. textField_1.setColumns(10);
  21. textField_1.setBounds(114 82 229 40);
  22. contentPane.add(textField_1);
  23. JButton btnNewButton = new JButton("\u67E5\u627E");
  24. btnNewButton.addActionListener(new ActionListener() {
  25. public void actionPerformed(ActionEvent e) {
  26. lblNewLabel_1.setText("共找到"+getResultNum()+"个结果");
  27. }
  28. });
  29. btnNewButton.setBounds(375 13 144 29);
  30. contentPane.add(btnNewButton);
  31. final JButton button = new JButton("\u67E5\u627E\u4E0B\u4E00\u4E2A");
  32. button.addActionListener(new ActionListener() {
  33. public void actionPerformed(ActionEvent e) {
  34. lblNewLabel_1.setText("共找到"+getResultNum()+"个结果");
  35. String str = textPane.getText();
  36. if(count == getResultNum()) {
  37. start = 0;
  38. count = 0;
  39. }
  40. if((start = str.indexOf(textField.getText(), start)) != -1) {
  41. textPane.setSelectionStart(start);
  42. textPane.setSelectionEnd(start+textField.getText().length());
  43. start+=textField.getText().length();
  44. count++;
  45. button.setText("查找下一个 "+count+"/"+getResultNum());
  46. }
  47. }
  48. });
  49. button.setBounds(375 55 144 29);
  50. contentPane.add(button);
  51. JButton button_1 = new JButton("\u66FF\u4EE3");
  52. button_1.addActionListener(new ActionListener() {
  53. public void actionPerformed(ActionEvent e) {
  54. textPane.replaceSelection(textField_1.getText());
  55. }
  56. });
  57. button_1.setBounds(375 97 144 29);
  58. contentPane.add(button_1);
  59. JButton button_2 = new JButton("\u5168\u90E8\u66FF\u4EE3");
  60. button_2.addActionListener(new ActionListener() {
  61. public void actionPerformed(ActionEvent e) {
  62. lblNewLabel_1.setText("共替代"+getResultNum()+"个");
  63. textPane.setText(textPane.getText().replaceAll(textField.getText(), textField_1.getText()));
  64. }
  65. });
  66. button_2.setBounds(375 139 144 29);
  67. contentPane.add(button_2);
  68. lblNewLabel_1 = new JLabel("");
  69. lblNewLabel_1.setBounds(14 135 347 29);
  70. contentPane.add(lblNewLabel_1);
  71. setVisible(true);
  72. }

3.3.4 加解密设计

具体实现代码如下:

  1. public class DesUtil {
  2. private final static String DES = "DES";
  3. private final static String ENCODE = "GBK";
  4. public static void main(String[] args) throws Exception {
  5. System.out.println(encrypt("hello" "123"));;
  6. }
  7. /**
  8. * Description 根据键值进行加密
  9. *
  10. * @param data
  11. * @param key
  12. * 加密键byte数组
  13. * @return
  14. * @throws Exception
  15. */
  16. public static String encrypt(String data String key) throws Exception {
  17. key = CreateMD5.getMd5(key);
  18. byte[] bt = encrypt(data.getBytes(ENCODE), key.getBytes(ENCODE));
  19. String strs = new BASE64Encoder().encode(bt);
  20. return strs;
  21. }
  22. /**
  23. * Description 根据键值进行解密
  24. *
  25. * @param data
  26. * @param key
  27. * 加密键byte数组
  28. * @return
  29. * @throws IOException
  30. * @throws Exception
  31. */
  32. public static String decrypt(String data String key) throws IOException
  33. Exception {
  34. key = CreateMD5.getMd5(key);
  35. if (data == null)
  36. return null;
  37. BASE64Decoder decoder = new BASE64Decoder();
  38. byte[] buf = decoder.decodeBuffer(data);
  39. byte[] bt = decrypt(buf key.getBytes(ENCODE));
  40. return new String(bt ENCODE);
  41. }
  42. /**
  43. * Description 根据键值进行加密
  44. *
  45. * @param data
  46. * @param key
  47. * 加密键byte数组
  48. * @return
  49. * @throws Exception
  50. */
  51. private static byte[] encrypt(byte[] data byte[] key) throws Exception {
  52. // 生成一个可信任的随机数源
  53. SecureRandom sr = new SecureRandom();
  54. // 从原始密钥数据创建DESKeySpec对象
  55. DESKeySpec dks = new DESKeySpec(key);
  56. // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
  57. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
  58. SecretKey securekey = keyFactory.generateSecret(dks);
  59. // Cipher对象实际完成加密操作
  60. Cipher cipher = Cipher.getInstance(DES);
  61. // 用密钥初始化Cipher对象
  62. cipher.init(Cipher.ENCRYPT_MODE securekey sr);
  63. return cipher.doFinal(data);
  64. }
  65. /**
  66. * Description 根据键值进行解密
  67. *
  68. * @param data
  69. * @param key
  70. * 加密键byte数组
  71. * @return
  72. * @throws Exception
  73. */
  74. private static byte[] decrypt(byte[] data byte[] key) throws Exception {
  75. // 生成一个可信任的随机数源
  76. SecureRandom sr = new SecureRandom();
  77. // 从原始密钥数据创建DESKeySpec对象
  78. DESKeySpec dks = new DESKeySpec(key);
  79. // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
  80. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
  81. SecretKey securekey = keyFactory.generateSecret(dks);
  82. // Cipher对象实际完成解密操作
  83. Cipher cipher = Cipher.getInstance(DES);
  84. // 用密钥初始化Cipher对象
  85. cipher.init(Cipher.DECRYPT_MODE securekey sr);
  86. return cipher.doFinal(data);
  87. }
  88. }

3.4 模块设计

文件操作模块 打开文件;保存文件
加解密模块 DES 加密;DES 解密
文本操作模块 查找文本;替代文本;写入文本

3.5 系统特点

  • 界面设计美观友好

  • 规范、完整的基础信息设置

  • 系统运行稳定、安全可靠

3.6 尚未解决的问题

会出现意外关闭的 bug。

四、系统测试

4.1 定义测试

  • 一级错误:不能完全满足系统要求,基本功能未完全实现;或者危及人身安全

  • 二级错误:严重地影响系统要求或基本功能的实现,且没有更正办法(重新安装或重新启动该软件不属于更正办法)

  • 三级错误:严重地影响系统要求或基本功能的实现,但存在合理的更正办法(重新安装或重新启动该软件不属于更正办法)

  • 四级错误:使操作者不方便或遇到麻烦,但它不影响执行工作功能或重要功能

  • 五级错误:其他错误

  • 回测:产生测试错误或缺陷的测试项由软件开发人员进行修改调试正确后,由软件测试人员再次进行的针对该测试项及其相关项的测试

4.2 功能需求测试项详述及测试结果

测试需求 测试重点及结果 测试结果
新建文本 主页面 成功
保存文本 主页面 成功
加密文本 保存的 txt 文件 成功
解密文本 保存的 txt 文件 成功
查找文本 主页面 成功
替代文本 主页面 成功

总结

当我看到课程设计题目时,有这么多题目和以前做过的类似,我再三考虑终于选了这个题目,刚开始的时侯我觉得做起来应该非常简单,可仔细分析、设计算法时才发现并没有我想像的那么简单。

由于本次课程设计是一个人一个题目,所以只有通过自已努力,有什么不懂的请教同学或在网上搜集一些资料,可网上的资料有很多的不足,刚开始的两天,感觉还有很多地方需要查资料,进度也比较慢。

在余下的日子里,自已不断地查资料,请教同学帮助,可是还是有一大堆的问题存在。可是难题依然没有得到解决,算法的改进真的让人苦思冥想,怎么去解决,查阅了一大堆的资料,还有就是模块化设计问题,平时的运用还不够熟悉,所以这一块也要查阅许多资料。通过每次自已的亲自动手,发现自已的知识还有很多的不足,比如:算法的灵活应用及一些不常用的类不熟悉,还有就是一个人的力量是有限,没有团队力量那么大的爆发力,做起事来总是单一方面的做,没有做到十全十美。程序不知道被我改了多少遍,可是还是有不足,多亏老师和同学们的帮助。

参考文献

  • [1] 朱福喜.《Java 语言程序设计》(第二版).科学出版社

  • [2] 陈国君等.《Java 程序设计基础》(第二版).清华大学出版社

  • [3] Deitel.《Java 大学基础教程》(第六版).电子工业出版社

  • [4] MaryCampione.《Java 语言导学》(第四版).机械工业出版社

  • [5] Y.DanielLiang.《Java 语言程序设计基础篇》(第六版).机械工业出版社

  • [6] KathySierra.《HeadFirstJava》(第二版).东南大学出版社

上传的附件 cloud_download Java记事本.docx ( 339.04kb, 0次下载 ) cloud_download MuziText.zip ( 36.18kb, 0次下载 )
error_outline 下载需要11点积分
eject