往期源码回顾:
【Java】实现绘图板(完整版)
【C++】图书管理系统(完整板)
【Java】实现计算器(完整版)
【Python】实现爬虫,爬取天气情况并进行分析(完整版)
由于需要的同学太多,此代码获取方式变更,如何获取请见此篇博客最下方
进入今天的正题:
1.整体设计思路如下:
(1)使用顶层容器JFrame。
(2)设置功能菜单并通过BorderLayout进行边框布局管理。
(3)设置相应按钮与文件编辑区。
(4)进行相应事件处理。
2.各功能菜单设计思路:
(1)打开功能:
用户点击打开后,可以选择文件中对应的txt或dat文件,用户确定选择后即可打开改文件并展示文件中的内容,并在程序正上方展示当前文件路径。
(2)新建功能:
用户点击新建功能后,将展示一个空白的记事本,用户可进行相应编辑。
(3)保存功能:
用户点击保存后,如果保存的文件已经存在路径,则直接进行覆盖,若不存在,则需用户自己选择保存的路径,并对保存的文件进行命名。
(4)设定循环加解密规则如下:按照ASCII字符编码(0-255),加密时对每一字符+10,(若超过255,减去255),解密时作对应反变换。我们可以在文件I/O时进行相应操作。 再也不用担心妈妈偷看你的笔记本啦✌️✌️✌️
(5)查找功能
支持输入文字查找文字内容并高亮
(6) 替换功能
支持通过输入要替换和替换为的文字,进行相应文本的替换
简单的运行示例如下,其他的大家可以自行测试:
保存后的txt文件是这样滴:
注意:用程序打开时是会正常显示哦!因为在读取的时候也做了相应解密。
例如,这是打开的,所以有了他,是不是在也不用怕小秘密被别人知道啦!!!😉😉😉
使用查找功能后的界面
话不多说,上源码:
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;
}
// 记事本新建操作
// 记事本打开文件操作
// 菜单 保存操作
}
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) {
}
}
void getCode()
{
cout<<需要完整源码,只需5r<<endl
cout <<需要卫星:ch18384322303,备注:记事本源码<<endl
}