补以下本该两个星期前发的考核心得
在此感谢书行师兄和泽涛师兄等各位师兄师姐的大力支持
项目说明文档
程序包含1个包,5个类:
Main,Main方法所在类,用于执行程序运行;
jFrame,程序大体框架和总调用组件添加函数
jMenuBar,生成各种子选项JMenuItem并写入总组件调用方法,代码末尾并添加事件监听
JMenuItemActionListener,各组件的事件监听,响应事件并分配到FileService类里头执行最后方法调用
FileService,用于存储各种事件调用的最终方法,为了方便不出错误new出的jTextArea放在此类
打开方式:打开项目,运行Main方法即可
由于本机机子不知有什么毛病,可能会出现组件无法正常运行出现
此时只需最小化窗口,再打开即可恢复正常。
本次考核项目优缺点:
先说说没实现的功能:区分大小写 这个难以与本项目的indexOf搭配实现
缺点:
1、新建项目直接暴力清空文本框,没有判定是否保存当前文本
2、保存功能没有设置判断是否路径是否直接保存,基本完全就等于 另存为 。
3、退出和关闭窗口没有是否文本框变动判定
4、字体没有设置初始化大小,没有加滚动条(主要是因为个人原因,时间比较紧,事多。。。很多简单的功能没时间调试实现)
5、查找和替换两个功能函数分重写了框,都在FileService的类里,所以FileService 的代码过半都是这两个函数。。。
6、分了类却没分包,很多细节不规范
优点:
1、其他功能缺点没提到的都基本正常,跟正常的记事本相差无几;
2、经过多轮调试没发现有报错。
备注:
1、输出到编译器控制台的是我当初用来检查功能顺便debug的。
2、个人用的IDEA写的
项目总结文档
项目包含1个包,5个类:
Main,Main方法所在类,用于执行程序运行;
jFrame,程序大体框架和总调用组件添加函数
jMenuBar,生成各种子选项JMenuItem并写入总组件调用方法,代码末尾并添加事件监听
JMenuItemActionListener,各组件的事件监听,响应事件并分配到FileService类里头执行最后方法调用
FileService,用于存储各种事件调用的最终方法,为了方便不出错误new出的jTextArea放在此类
设计思路:
类之间建立必要的继承关系,从而维持各类之间方法调用。
以下为各类之间的依次继承关系,即FileService为最老的父类。
过程中遇到的问题以及解决:
整个项目完全处于半学半写状态,学到啥就往自己项目加点啥。
首先一开始就是很挫折的swing组件完全没接触过完全什么都一步步慢慢开始学,上个学期自己啃过的I/O快忘光了也只能从头拾起。从问师兄借课本学swing(我们这版课本讲的是javaFX)到b站找资源学组件怎么用,到csdn看别人的博客归类swing还有哪些组件和分布各种等等,再到上博客园、csdn等看别人怎么写的初步框架,然后到上github爬别人的项目(发现不是乱码看不了就是完全看不懂还有些自己写协议的大佬)
其次,输入输出文件时的编码问题,请教了下书行师兄搜了搜博客得以解决。
再,书行师兄指出我类分得不好,并给了我应如何分类的建议。
最后,折腾了我一个多星期的对象问题。一开始因为new的姿势不太对,导致文本框除了键盘输入其他功能完全无法正常使用,泽涛师兄帮我看了看指出了我的坑,然后自己捣鼓了一两天。原本是这样的继承这样的new
后来自己调试才变成上面的继承(捂脸,这方案我也很想吐槽但实在想不出别的)
回答问题:
1、对这份考核作业的评价,如个人觉得实现这份考核作业的难易程度、预计实现耗时、对自己的打击程度,帮助程度以及是否有提升作用等
考核评价:萌新不敢说难易,但给我记事本和计算器里挑我肯定挑计算器(简单太多了吧…)
预计耗时:三周 实际耗时:折合三周上下
打击程度:还阔以
帮助程度:很有帮助,个人感觉这半个月是真的学到了不少,与大佬的。
是否有提升:有,个人感觉水平提升。顺便从eclipse跳槽到了IDEA,IDEA确实方便。
代码部分
jFrame类
import javax.swing.*;
public class jFrame extends jMenuBar{
//顶级容器
JFrame jFrame = new JFrame("Just for test.");
//菜单栏
JMenuBar jMenuBar = new JMenuBar();
/**
* 各种设置数据
*/
public void setAll(){
setjFrame();
addAll();
//添加文本框进入面板
jFrame.add(jTextArea);
//设置监听者
addListener();
//设置文本区可编辑可用
jTextArea.setEditable(true);
jTextArea.setEnabled(true);
}
public void setjFrame() {//设置尺寸大小等杂七杂八
//设置尺寸
jFrame.setSize(800, 600);
//起始位置居中
jFrame.setLocationRelativeTo(null);
//窗口不能调节大小
//jFrame.setResizable(false);
//关闭窗口,退出程序
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//窗口可见
jFrame.setVisible(true);
}
public void addAll(){
//添加菜单栏进入面板
jFrame.setJMenuBar(jMenuBar);
//往菜单栏扔菜单
jMenuBar.add(file);
jMenuBar.add(edit);
jMenuBar.add(format);
//各菜单扔进菜单栏
addFileItem();
addeditItem();
addFormatItem();
}
}
jMenuBar类
import javax.swing.*;
import java.awt.*;
public class jMenuBar extends JMenuItemActionListener{
/**
* 菜单1--文件
*/
JMenu file = new JMenu("文件");
//子选项1--新建
JMenuItem newFile = new JMenuItem("新建");
//子选项2--打开
JMenuItem open = new JMenuItem("打开");
//子选项3--保存
JMenuItem save = new JMenuItem("保存");
//子选项4--另存为
JMenuItem saveAs = new JMenuItem("另存为");
//子选项5--退出
JMenuItem exit = new JMenuItem("退出");
public void addFileItem(){//添加自选项的函数
//子选项1New扔进菜单file
file.add(newFile);
//子选项2open扔进菜单file
file.add(open);
//子选项3save扔进菜单file
file.add(save);
//子选项4svaeAs扔进菜单file
file.add(saveAs);
//加入分割线
file.addSeparator();
//子选项5exit扔进菜单file
file.add(exit);
}
/**
* 菜单2--编辑
*/
JMenu edit = new JMenu("编辑");
//撤销
//JMenuItem undo = new JMenuItem("撤销");
//子选项1--复制
JMenuItem copy = new JMenuItem("复制");
//子选项2--黏贴
JMenuItem paste = new JMenuItem("黏贴");
//子选项3--删除
JMenuItem delete = new JMenuItem("删除");
//子选项4--剪切
JMenuItem cut = new JMenuItem("剪切");
//子选项5--查找
JMenuItem search = new JMenuItem("查找");
//子选项6--替换
JMenuItem replace = new JMenuItem("替换");
//子选项7--日期
JMenuItem data = new JMenuItem("日期");
public void addeditItem(){//添加自选项的函数
//子选项0undo扔进菜单2edit
//edit.add(undo);
//子选项1copy扔进菜单2edit
edit.add(copy);
//子选项2paste扔进菜单2deit
edit.add(paste);
//子选项3copy扔进菜单2edit
edit.add(delete);
//子选项4cut扔进菜单2edit
edit.add(cut);
//子选项5search扔进菜单2edit
edit.add(search);
//子选项6replace扔进菜单2edit
edit.add(replace);
//子选项7data扔进菜单2edit
edit.add(data);
}
/**
* 菜单3--格式
*/
JMenu format = new JMenu("格式");
//子选项1--自动换行
JCheckBoxMenuItem autoSetLineWrap = new JCheckBoxMenuItem("自动换行");
public void addFormatItem(){//添加自选项的函数
//子选项1扔进菜单1
format.add(autoSetLineWrap);
}
public void addListener(){
JMenu[] menu = new JMenu[3];
menu[0] = this.file;
menu[1] = this.edit;
for (int j=0;j<2;j++){
for (Component component:menu[j].getMenuComponents()) {
if (component instanceof JMenuItem){
((JMenuItem) component).addActionListener(this);
}
}
}
//JCheckBoxMenuItem类型不同,单独加一下,不然不能用
autoSetLineWrap.addActionListener(this);
}
}
JMenuItemActionListener类
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JMenuItemActionListener extends FileService implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JMenuItem currentItem = (JMenuItem) e.getSource();
switch (currentItem.getText()){
//菜单1功能
case "新建":
newFile();
break;
case "打开":
open();
break;
case "保存":
save();
break;
case "另存为":
saveAs();
break;
case "退出":
exit();
break;
//菜单2功能
/*case "撤销":
setUndoManager();
break;*/
case "复制":
copy();
break;
case "黏贴":
paste();
break;
case "删除":
delete();
break;
case "剪切":
cut();
break;
case "查找":
search();
break;
case "替换":
replace();
break;
case "日期":
data();
break;
//菜单3功能
case "自动换行":
autoSetLineWrap();
break;
default:
}
}
}
FileService类
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.undo.UndoManager;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.text.DateFormat;
import java.util.Date;
public class FileService {
UndoManager undoManager = new UndoManager();
//文本框
JTextArea jTextArea = new JTextArea("It is a text.");
//定义一个文件选择框
JFileChooser jFileChooser = null;
//文件输入流
FileReader fileReader = null;
//文件输出流
FileWriter fileWriter = null;
//缓冲输入流
BufferedReader bufferedReader = null;
//缓冲输出流
BufferedWriter bufferedWriter = null;
//新建---(稍微暴力一下)
void newFile() {
jTextArea.setText("");
}
//打开
void open(){
//实例化对象
jFileChooser = new JFileChooser();
//设置弹出选择框标题
jFileChooser.setDialogTitle("打开");
//设置默认路径
jFileChooser.showOpenDialog(null);
//弹出窗口
jFileChooser.setVisible(true);
//检查文件选择框返回地址
File check = jFileChooser.getSelectedFile();
if(check==null){
return;
}
//用address保存用户编辑文件的绝对路径
String address = jFileChooser.getSelectedFile().getAbsolutePath();
/*
//Stringbuilder存储
StringBuilder temp = new StringBuilder();
try {
//实例化文件输入流
fileReader = new FileReader(address);
//实例化缓冲字符输入流
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(address),"GBK"));
String line= null;
while ((line= bufferedReader.readLine()) != null) {
temp.append(line);
System.out.println(temp);
}
jf.jTextArea.setText(String.valueOf(temp.toString()));
bufferedReader.close();
fileReader.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}*/
//字符串能存换行符,上边的StringBuilder亲测不能,所以就用这个先
try {
//实例化文件输入流
fileReader = new FileReader(address);
//实例化缓冲字符输入流
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(address),"UTF-8"));
//设置字符串为空
String str = "";
//定义一个strall存储文件全部信息
String strAll="";
//缓冲区拿数据
while((str = bufferedReader.readLine()) != null) {
strAll += str + "\r\n";
}
System.out.println(strAll);
jTextArea.setText(strAll);//一次性硬塞
} catch (IOException e1) {
e1.printStackTrace();
}finally {
//关闭流文件,不关会占用系统内存
try {
bufferedReader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
fileReader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
//保存
void save(){
//实例化对象
jFileChooser = new JFileChooser();
//设置弹出选择框标题
jFileChooser.setDialogTitle("保存");
//设置默认路径
jFileChooser.showSaveDialog(null);
//弹出窗口
jFileChooser.setVisible(true);
//检查文件选择框返回地址
File check = jFileChooser.getSelectedFile();
if(check==null){
return;
}
//用address保存用户编辑文件的绝对路径
String address = jFileChooser.getSelectedFile().getAbsolutePath();
if(address==null){
return;
}
System.out.println(address);
try {
//实例化文件输出流写出文件
fileWriter = new FileWriter(address);
//实例化缓冲字符输出流
bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(address),"GBK"));
//获取记事本字符串写出
System.out.println(jTextArea.getText());
fileWriter.write(jTextArea.getText());
} catch (IOException e1) {
e1.printStackTrace();
}finally {
//关闭流文件,不关会占用系统内存
try {
bufferedWriter.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
fileWriter.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
//另存为
void saveAs(){
//实例化对象
jFileChooser = new JFileChooser();
//设置弹出选择框标题
jFileChooser.setDialogTitle("保存");
//设置默认路径
jFileChooser.showSaveDialog(null);
//弹出窗口
jFileChooser.setVisible(true);
//检查文件选择框返回地址
File check = jFileChooser.getSelectedFile();
if(check==null){
return;
}
//用address保存用户编辑文件的绝对路径
String address = jFileChooser.getSelectedFile().getAbsolutePath();
System.out.println(address);
if(address==null){
return;
}
System.out.println(address);
try {
//实例化文件输出流写出文件
fileWriter = new FileWriter(address);
//实例化缓冲字符输出流
bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(address),"GBK"));
//获取记事本字符串写出
System.out.println(jTextArea.getText());
fileWriter.write(jTextArea.getText());
} catch (IOException e1) {
e1.printStackTrace();
}finally {
//关闭流文件,不关会占用系统内存
try {
bufferedWriter.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
fileWriter.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
//退出
void exit(){
System.exit(0);
}
//撤销
/*void setUndoManager(){
if (undoManager.canUndo()){
undoManager.undo();
}
}*/
//复制
void copy(){
jTextArea.copy();
}
//黏贴
void paste(){
jTextArea.paste();
}
//删除
void delete(){
jTextArea.replaceRange("",jTextArea.getSelectionStart(),jTextArea.getSelectionEnd());
}
//剪切
void cut(){
jTextArea.cut();
}
/**
* 查找
*/
JFrame jInternalFrame;
JPanel panel;
//查找文本域
JTextField jTextField = new JTextField(8);
//标签--方向
JLabel direction = new JLabel("方向");
//单选按钮--向上
JRadioButton toUp = new JRadioButton("向上");
//单选按钮--向下
JRadioButton toDown = new JRadioButton("向下");
//设置按钮组
ButtonGroup buttonGroup = new ButtonGroup();
//区分大小写指针,1区分,0不区分
int cs = 0;
void search(){
//内部框
jInternalFrame = new JFrame();
//创建面板
panel = new JPanel(null);
//标签--查找内容
JLabel jLabel = new JLabel("查找内容:");
//按钮1--查找下一个
JButton searchNext = new JButton("查找下一个");
//按钮2--取消
JButton cancel = new JButton("取消");
//复选框--区分大小写
JCheckBox caseSensitive = new JCheckBox("区分大小写");
//默认选中向下
toDown.setSelected(true);
//窗口基本设置
jInternalFrame.setSize(500,300);
jInternalFrame.setLocation(700,300);
jInternalFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//设置标签参数
jLabel.setSize(100,50);
jLabel.setLocation(30,10);
jLabel.setFont(new Font(null, Font.PLAIN, 15));
jLabel.setVisible(true);
panel.add(jLabel);
//方向标签
direction.setSize(70,50);
direction.setLocation(330,170);
direction.setVisible(true);
panel.add(direction);
//设置文本域参数
jTextField.setSize(250,30);
jTextField.setLocation(120,20);
jTextField.setEnabled(true);
jTextField.setEditable(true);
panel.add(jTextField);
//设置两个功能按钮参数
searchNext.setSize(100,30);
searchNext.setLocation(80,100);
cancel.setSize(100,30);
cancel.setLocation(300,100);
panel.add(searchNext);
panel.add(cancel);
//复选框参数
caseSensitive.setSize(100,50);
caseSensitive.setLocation(20,200);
caseSensitive.setVisible(true);
panel.add(caseSensitive);
caseSensitive.setSelected(true);
//添加按钮进按钮组
buttonGroup.add(toUp);
buttonGroup.add(toDown);
//设置按钮参数
toUp.setSize(70,50);
toDown.setSize(70,50);
toUp.setLocation(320,200);
toDown.setLocation(400,200);
panel.add(toUp);
panel.add(toDown);
//添加面板
panel.setVisible(true);
jInternalFrame.setContentPane(panel);
jInternalFrame.setVisible(true);
//添加监听者
//查找下一个
searchNext.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//见最下边的函数
searchNextOne();
}
});
//取消
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
end = 0;
jInternalFrame.dispose();
}
});
//区分大小写
caseSensitive.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
cs = 1;
}
});
//向上
toUp.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
}
});
//向下
toDown.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
}
});
}
//替换
void replace(){
//内部框
jInternalFrame = new JFrame();
//创建面板
panel = new JPanel(null);
//窗口基本设置
jInternalFrame.setSize(500,300);
jInternalFrame.setLocation(700,300);
jInternalFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//文本域--2,替换为
JTextField jTextField2 = new JTextField(8);
//标签--查找内容
JLabel jLabel = new JLabel("查找内容:");
//标签--替换为
JLabel jLabel2 = new JLabel("替换为:");
//按钮1--查找下一个
JButton searchNext = new JButton("查找下一个");
//按钮2--替换
JButton replace = new JButton("替换");
//按钮3--全部替换
JButton replaceAll = new JButton("全部替换");
//按钮4--取消
JButton cancel = new JButton("取消");
//复选框--区分大小写
JCheckBox caseSensitive = new JCheckBox("区分大小写");
//设置标签参数
jLabel.setSize(100,50);
jLabel.setLocation(30,10);
jLabel.setFont(new Font(null, Font.PLAIN, 15));
jLabel.setVisible(true);
panel.add(jLabel);
//设置标签参数
jLabel2.setSize(100,50);
jLabel2.setLocation(30,60);
jLabel2.setFont(new Font(null, Font.PLAIN, 15));
jLabel2.setVisible(true);
panel.add(jLabel2);
//设置文本域1参数
jTextField.setSize(200,30);
jTextField.setLocation(120,20);
jTextField.setEnabled(true);
jTextField.setEditable(true);
panel.add(jTextField);
//设置文本域2参数
jTextField2.setSize(200,30);
jTextField2.setLocation(120,70);
jTextField2.setEnabled(true);
jTextField2.setEditable(true);
panel.add(jTextField2);
//设置按钮参数
searchNext.setSize(100,30);
searchNext.setLocation(350,20);
replace.setSize(100,30);
replace.setLocation(350,70);
replaceAll.setSize(100,30);
replaceAll.setLocation(350,120);
cancel.setSize(100,30);
cancel.setLocation(350,170);
panel.add(searchNext);
panel.add(replace);
panel.add(replaceAll);
panel.add(cancel);
//复选框参数
caseSensitive.setSize(100,50);
caseSensitive.setLocation(20,200);
caseSensitive.setVisible(true);
panel.add(caseSensitive);
caseSensitive.setSelected(true);
//添加面板
panel.setVisible(true);
jInternalFrame.setContentPane(panel);
jInternalFrame.setVisible(true);
//添加监听者
//查找下一个
searchNext.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
searchNextOne();
}
});
//替换
replace.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (jTextField.getText()==null){
JOptionPane.showConfirmDialog(null,"无替换内容");
}
else if (jTextField.getText().equals(jTextArea.getSelectedText())){
jTextArea.replaceRange(jTextField2.getText(), jTextArea.getSelectionStart(), jTextArea.getSelectionEnd());
}
}
});
//全部替换
replaceAll.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = jTextField.getText();
end = 0;//尾光标归0
int x = jTextArea.getText().indexOf(temp, end);
if (x==-1){//再按一次 全部替换 的弹出提示
JOptionPane.showConfirmDialog(null,"无替换内容");
return;
}
while(true){//方向向下
//索引
x = jTextArea.getText().indexOf(temp, end);
if (x==-1){
jTextArea.replaceRange(jTextField2.getText(),jTextArea.getSelectionStart(),jTextArea.getSelectionEnd());
break;
}else{
jTextArea.replaceRange(jTextField2.getText(),jTextArea.getSelectionStart(),jTextArea.getSelectionEnd());
end = x+temp.length();
jTextArea.setSelectionStart(x);
jTextArea.setSelectionEnd(x+temp.length());
}
}
}
});
//取消
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
end = 0;
jInternalFrame.dispose();
}
});
//区分大小写
caseSensitive.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
cs = 1;
}
});
}
//时间日期
void data(){
Date a = new Date();
DateFormat mediumDateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
System.out.println(mediumDateFormat.format(a));
jTextArea.replaceRange(mediumDateFormat.format(a),jTextArea.getSelectionStart(),jTextArea.getSelectionEnd());
}
//自动换行
void autoSetLineWrap(){
jTextArea.setLineWrap(true);
}
//查找函数
int end = 0;// 尾光标
void searchNextOne(){
String temp = jTextField.getText();
if (toDown.isSelected()){//方向向下
if (end!=0){//卡位关键
end=jTextArea.getSelectionEnd();
}
int x = jTextArea.getText().indexOf(temp, end);//indexof查找
System.out.println(x+" 向下");//debug用
if (x==-1){//没有则弹框
JOptionPane.showConfirmDialog(null,"没找到 "+temp);
}else{
end = x+temp.length();
jTextArea.setSelectionStart(x);
jTextArea.setSelectionEnd(end);
}
}else if (toUp.isSelected()){//方向向上
end=jTextArea.getSelectionEnd();
int x = jTextArea.getText().lastIndexOf(temp,end-temp.length()-1);//indexof倒序查找
System.out.println(x+" 向上");//debug用
if(x==-1){//没有则弹框
JOptionPane.showConfirmDialog(null,"没找到 "+temp);
}else{
end = x+temp.length();
jTextArea.setSelectionStart(x);
jTextArea.setSelectionEnd(end);
}
}
}
}
最后的Main
public class Main{
public static void main(String[] args){
jFrame jf = new jFrame();
jf.setAll();
}
}