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实现简易的分词器功能
Jun 15 Java/Android
详解Java实践之适配器模式
Jun 18 Java/Android
SpringBoot实现异步事件驱动的方法
Jun 28 Java/Android
Spring-cloud Config Server的3种配置方式
Sep 25 Java/Android
Java中try catch处理异常示例
Dec 06 Java/Android
Netty客户端接入流程NioSocketChannel创建解析
Mar 25 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
Apr 13 Java/Android
Spring Data JPA框架持久化存储数据到数据库
Apr 28 Java/Android
Android开发手册TextInputLayout样式使用示例
Jun 10 Java/Android
利用Java连接Hadoop进行编程
Jun 28 Java/Android
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
Aug 05 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
如何在PHP中使用Oracle数据库(2)
2006/10/09 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现定时同步本机与北京时间的方法
2015/03/24 Python
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
python 多个参数不为空校验方法
2019/02/14 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
擅自离岗检讨书
2014/02/11 职场文书
建筑管理专业求职信
2014/07/28 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
倡议书范文大全
2015/04/28 职场文书
重阳节主题班会
2015/08/17 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python