Java完整实现记事本代码


Posted in Java/Android onJune 16, 2022

进入今天的正题:

1.整体设计思路如下:

(1)使用顶层容器JFrame。

(2)设置功能菜单并通过BorderLayout进行边框布局管理。

(3)设置相应按钮与文件编辑区。

(4)进行相应事件处理。

2.各功能菜单设计思路:

(1)打开功能:

用户点击打开后,可以选择文件中对应的txt或dat文件,用户确定选择后即可打开改文件并展示文件中的内容,并在程序正上方展示当前文件路径。

(2)新建功能: 用户点击新建功能后,将展示一个空白的记事本,用户可进行相应编辑。

(3)保存功能: 用户点击保存后,如果保存的文件已经存在路径,则直接进行覆盖,若不存在,则需用户自己选择保存的路径,并对保存的文件进行命名。

(4)设定循环加解密规则如下:按照ASCII字符编码(0-255),加密时对每一字符+10,(若超过255,减去255),解密时作对应反变换。我们可以在文件I/O时进行相应操作。 再也不用担心妈妈偷看你的笔记本啦✌️✌️✌️

简单的运行示例如下,其他的大家可以自行测试:

Java完整实现记事本代码

保存后的txt文件是这样滴:

Java完整实现记事本代码

注意:用程序打开时是会正常显示哦!因为在读取的时候也做了相应解密。

例如,这是打开的,所以有了他,是不是在也不用怕小秘密被别人知道啦!!!???

Java完整实现记事本代码

话不多说,上源码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.filechooser.FileNameExtensionFilter;
import chenhao.io.TextTool;
public class TextPad {
	private JTextArea contentArea;
	private JFrame frame;
	private String fileName;
	public TextPad() {
		frame = new JFrame("记事本");
		frame.setSize(500, 500);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 添加菜單
		JMenuBar menuBar = new JMenuBar();
		JMenu menu = new JMenu("文件");
		JMenuItem newItem = new JMenuItem("新建");
		newAction(newItem);
		menu.add(newItem);
		JMenuItem openItem = new JMenuItem("打开");
		openAction(openItem);
		menu.add(openItem);
		JMenuItem saveItem = new JMenuItem("保存");
		saveAction(saveItem);
		menu.add(saveItem);
		menuBar.add(menu);
		frame.setJMenuBar(menuBar);
		// 布局
		frame.setLayout(new BorderLayout());
		JToolBar toolBar = new JToolBar();
		JComboBox<String> fontCom = fontAction();
		toolBar.add(fontCom);
		JComboBox<String> fontSize = fontSizeAction();
		toolBar.add(fontSize);
		fontStyleAction(toolBar);
		JButton colorbtn = fontColorAction();
		toolBar.add(colorbtn);
		frame.add(toolBar, BorderLayout.NORTH);
		// 文件编辑区
		contentArea = new JTextArea();
		JScrollPane pane = new JScrollPane(contentArea);
		frame.add(pane);
		frame.setVisible(true);
	}
	private JButton fontColorAction() {
		JButton colorbtn = new JButton("■");
		colorbtn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				Color color = colorbtn.getForeground();
				Color co = JColorChooser.showDialog(TextPad.this.frame, "设置字体颜色", color);
                 colorbtn.setForeground(co);
                 contentArea.setForeground(co);
			}
		});
		return colorbtn;
	}
	// 记事本,字体格式
	private void fontStyleAction(JToolBar toolBar) {
		JCheckBox boldBox = new JCheckBox("粗体");
		JCheckBox itBox = new JCheckBox("斜体");
		ActionListener actionListener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				boolean bold = boldBox.isSelected();
				boolean it = itBox.isSelected();
				int style = (bold ? Font.BOLD : Font.PLAIN) | (it ? Font.ITALIC : Font.PLAIN);
				Font font = contentArea.getFont();
				contentArea.setFont(new Font(font.getName(), style, font.getSize()));
				//contentArea.setFont(new Font(font.getName(), style, font.getSize()));
			}
		};
		boldBox.addActionListener(actionListener);
		itBox.addActionListener(actionListener);
		toolBar.add(boldBox);
		toolBar.add(itBox);
	}
	// 记事本,设置字体大小
	private JComboBox<String> fontSizeAction() {
		String[] fontSizes = new String[] { "10", "20", "30", "50" };
		JComboBox<String> fontSize = new JComboBox<>(fontSizes);
		fontSize.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				int size = Integer.valueOf((String) fontSize.getSelectedItem());
				Font font = TextPad.this.contentArea.getFont();
				TextPad.this.contentArea.setFont(new Font(font.getName(), font.getStyle(), size));
			}
		});
		return fontSize;
	}
	// 记事本,设置字体
	private JComboBox<String> fontAction() {
		GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
		String[] fontNames = environment.getAvailableFontFamilyNames();
		JComboBox<String> fontCom = new JComboBox<>(fontNames);
		fontCom.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String fontName = (String) fontCom.getSelectedItem();
				Font font = TextPad.this.contentArea.getFont();
				TextPad.this.contentArea.setFont(new Font(fontName, font.getStyle(), font.getSize()));
			}
		});
		return fontCom;
	}
	// 记事本新建操作
	private void newAction(JMenuItem newItem) {
		newItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				contentArea.setText("");
				frame.setTitle("新建-记事本");
				fileName = null;
			}
		});
	}
	// 记事本打开文件操作
	private void openAction(JMenuItem openItem) {
		openItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JFileChooser chooser = new JFileChooser();
				FileNameExtensionFilter filter = new FileNameExtensionFilter("Text & dat", "txt", "dat");
				chooser.setFileFilter(filter);
				int returnVal = chooser.showOpenDialog(frame);
				if (returnVal == JFileChooser.APPROVE_OPTION) {
					String fileName = chooser.getSelectedFile().getPath();
					TextPad.this.fileName = fileName;
					String content = TextTool.read(fileName);
					contentArea.setText(content);
					TextPad.this.frame.setTitle(fileName + "- 记事本");
				}
			}
		});
	}
	// 菜单 保存操作
	private void saveAction(JMenuItem saveItem) {
		saveItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (TextPad.this.fileName != null) {
					String content = TextPad.this.contentArea.getText();
					TextTool.write(TextPad.this.fileName, content);
				} else {
					JFileChooser chooser = new JFileChooser();
					FileNameExtensionFilter filter = new FileNameExtensionFilter("Text & dat", "txt", "dat");
					chooser.setFileFilter(filter);
					int returnVal = chooser.showSaveDialog(frame);
					if (returnVal == JFileChooser.APPROVE_OPTION) {
						String fileName = chooser.getSelectedFile().getPath();
						TextPad.this.fileName = fileName;
						String content = TextPad.this.contentArea.getText();
						TextTool.write(TextPad.this.fileName, content);
						TextPad.this.frame.setTitle(fileName + "- 记事本");
					}
				}
			}
		});
	}
	public static void main(String[] args) {
		TextPad pad = new TextPad();
	}
}
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Reader;
import java.io.Writer;
import javax.swing.JOptionPane;
public class TextTool {
	public static String read(String fileName) {
		try (Reader reader = new FileReader(fileName); BufferedReader buff = new BufferedReader(reader);) {
			String str;
			StringBuilder sb = new StringBuilder();
			while ((str = buff.readLine()) != null) {
				str = decoding(str);
				sb.append(str + "\n");
			}

			return sb.toString();
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "找不到文件路径" + fileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	public static void write(String fileName, String content) {

		try (Writer writer = new FileWriter(fileName);) {
			content = encoding(content);
			writer.write(content);
			writer.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static String encoding(String str) {
		String temp = "";
		for (int i = 0; i < str.length(); i++) {
			if(str.charAt(i)=='\n')
			{
				temp+=str.charAt(i);
			}
			else if (0 <= str.charAt(i) && str.charAt(i) <= 255)
				temp += (char) ((str.charAt(i) - '0' + 10) % 255);
			else
				temp += str.charAt(i);
		}
		return temp;
	}
	public static String decoding(String str) {
		String temp = "";
		for (int i = 0; i < str.length(); i++) {
			if(str.charAt(i)=='\n')
			{
				temp+=str.charAt(i);
			}
			else if (0 <= str.charAt(i) && str.charAt(i) <= 255)
				temp += (char) ((str.charAt(i) + '0' - 10 + 255) % 255);
			else
				temp += str.charAt(i);
		}
		return temp;
	}
}

到此这篇关于Java完整实现记事本代码的文章就介绍到这了,更多相关Java记事本内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
Java Shutdown Hook场景使用及源码分析
Jun 15 Java/Android
总结Java对象被序列化的两种方法
Jun 30 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
关于Spring配置文件加载方式变化引发的异常详解
Jan 18 Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 Java/Android
SpringBoot中使用Redis作为全局锁示例过程
Mar 24 Java/Android
Android开发之WECHAT微信小程序路由跳转的两种形式
Apr 12 Java/Android
java版 简单三子棋游戏
May 04 Java/Android
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
Jun 01 Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 Java/Android
HttpClient实现文件上传功能
Aug 14 Java/Android
Springboot中如何自动转JSON输出
Jun 16 #Java/Android
springboot为异步任务规划自定义线程池的实现
详解Flutter自定义应用程序内键盘的实现方法
ConditionalOnProperty配置swagger不生效问题及解决
Jun 14 #Java/Android
Java异常体系非正常停止和分类
Android开发手册TextInputLayout样式使用示例
Jun 10 #Java/Android
Java实现简单小画板
You might like
360通用php防护代码(使用操作详解)
2013/06/18 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
PHP多文件上传类实例
2015/03/07 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
React实现轮播效果
2020/08/25 Javascript
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
python range实例用法分享
2020/02/06 Python
python批量生成条形码的示例
2020/10/10 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
营业用房租赁协议书
2014/11/26 职场文书
同事去世追悼词
2015/06/23 职场文书
python实现的web监控系统
2021/04/27 Python
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers