java课程设计简易记事本

程鸿波
2023-12-01

**

java课程设计《简易记事本》

**
第一次在博客上发布文章。这是我在大二上学期的java课程设计,我的课程设计是做一个简易记事本。其中有这些要求:1. 摸拟windows操作系统中的记事本软件,开发一款简易记事本2. 具有新建文件、保存文件、复制和粘贴功能3. 可以根据自身能力添加其它功能。
一、设计概述
该程序为简易记事本,目的是摸拟windows操作系统中的记事本软件,开发一款简易记事本,是开发的记事本具有新建文件、保存文件、打开文件、复制、剪切、粘贴、设置背景颜色和字体等功能。
本程序使用了窗口交互界面,主要运用了Java swing组件和动作事件监听器,还用到了文件的输入输出流。记事本的界面参考了Window中记事本界面,并且根据课程设计要求做了适当的调整,相应地添加了其他功能。

二、总体设计
2.1程序设计思路
在本程序中,设计了一个菜单栏和文本区。设计过程中用了JMenuBar,JFileChooser,JScrollPane,JMenu等。JMenuBar包括用来制作”文件”,“工具”,“背景”,“字体”,“关于”。JTextArea主要用来输入文本。
2.2总体设计
这次编写的简易记事本一共有4个源文件。类之间的主要关系如图所示。主类是NoteBook;子类有Mytext,BackgroundClorListener,HandkeListener。
NoteBook.java文件生成的类负责创建简易记事本的“窗口”和设置窗口的相关信息。该类含有main方法,整个程序从该类开始执行。
Mytext.java文件生成的类Mytext继承JFrame类作为底层容器,负责添加窗口的组件和为组件添加监视器。整个记事本分为两块菜单栏和内容输入区;为了实现相关功能,添加监听事件。本程序为了实现ActionListener接口,用来监听并处理部分菜单项和内容输入区为事件源的事件。
BackgroundColorListener.java文件生成的类BackgroundColorLisener负责重写监视器方法,实现设置文本区背景颜色的功能。
HandleListener.javajava文件生成的类HandleListener负责重写监视器的方法,负责实现复制、剪切、粘贴的功能。
2.3详细设计代码

//主函数
Jishiben.java
public class Jishiben{
	public static  void main(String args[]){
		Mytext text=new Mytext(“&随手一记”,100,90,600,600”);
//创建窗口、设置窗口名称和大小
	}
}
Mytext.java
//Mytext类
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.*;
import  javax.swing.JFrame.*;
import java.io.*;
import javax.swing.filechooser.*;
public class Mytext extends JFrame implements ActionListener{
JTextArea area;//创建文本区
JMenuBar menubar;//创建菜单条
JButton button;//创建按钮
JFileChooser fileDialog;//创建对话框
BufferedReader in;//创建缓冲输入流
FileReader fileReader;//创建文件字符输入流
BufferedWriter out;//缓冲输出流
FileWriter fileWriter;//创建文件字符输出流
JMenu menu1,menu2,menu3,menu4,menu5,menu6,menu7,menu8,menu9;//创建菜单、子菜单
JmenuItem item1,item2,item3,item4,item5,item6,item7,item8,item9,item10,item11,item12,item13,
item14,item15,item16,item17,item18,item19,item20,item21,item22,item23,item24,
item25,item26,item27,item28,item29;//创建菜单项
//添加组件方法
public  Mytext(String s,int x,int y,int h,int w){
	init(s);
	setLocation(x,y);
	setSize(h,w);
	setVisible(true);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使用结束后释放该窗口,退出程序
	}
	void init(String s){
	setTitle(s);
	menubar=new JMenuBar();
button=new JButton();
	area=new JTextArea();
	menu1=new JMenu("文件(File)");
	menu2=new JMenu("工具(Tool)");
	menu3=new JMenu("颜色(Color)");
	menu4=new JMenu("背景(Background)");
	menu5=new JMenu("字体(Font)");
	menu6=new JMenu("字号");
	menu7=new JMenu("字形");
	menu8=new JMenu("恢复原字体");
	menu9=new JMenu("关于");
	item1=new JMenuItem("复制(Copy)");
item2=new JMenuItem("剪切(Cut)");
	item3=new JMenuItem("粘贴(Paste)");
	item4=new JMenuItem("新建(Newset)");
	item5=new JMenuItem("保存(Paste)");
	item6=new JMenuItem("灰色(Gray)");
	item7=new JMenuItem("粉色(Pink)");
	item8=new JMenuItem("白色(White)");
	item9=new JMenuItem("红色(Red)");
	item10=new JMenuItem("黑色(Black)");
	item11=new JMenuItem("绿色(Green)");
	item12=new JMenuItem("黄色(Yellow)");
	item13=new JMenuItem("粉色(Pink)");
	item14=new JMenuItem("白色(White)");
	item15=new JMenuItem("红色(Red)");
	item16=new JMenuItem("黑色(Black)");
	item17=new JMenuItem("绿色(Green)");
	item18=new JMenuItem("黄色(Yellow)");
	item19=new JMenuItem("30");
	item20=new JMenuItem("40");
	item21=new JMenuItem("50");
	item22=new JMenuItem("加粗");
	item23=new JMenuItem("楷体");
	item24=new JMenuItem("华文新魏");
	item25=new JMenuItem("行书");
	item26=new JMenuItem("格式化");
	item27=new JMenuItem("相关提示");
	item28=new JMenuItem("退出(格式化)");
	item29=new JMenuItem("打开(Open)");
	area.setLineWrap(true);//自动换行
	button.add(item28);
	add(button,BorderLayout.SOUTH);//添加按钮,在南面
add(new JScrollPane(area),BorderLayout.CENTER);
//创建滚动条,将文本区在中间位置,BordedLayout布局
	area.setFont(new Font("宋体",0,20));
	//默认字体为宋体,0是不加粗字体,1是加粗的,字号为20
	fileDialog=new JFileChooser();
	FileNameExtensionFilter filter=new FileNameExtensionFilter("文本文件","html","java");
	//文件对话框可见的类型
	fileDialog.setFileFilter(filter);
	//设置对话框默认打开或显示的文件类型
	item1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
	//设置复制的功能的快捷键为Ctrl+C
item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,InputEvent.CTRL_MASK));
//设置剪切的功能的快捷键为Ctrl+Q
item3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
//设置粘贴的功能的快捷键为Ctrl+V
item4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));
//设置新建的功能的快捷键为Ctrl+N
item5.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));
//设置保存的功能的快捷键为Ctrl+P
item5.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
//设置打开的功能的快捷键为Ctrl+O
item28.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputEvent.CTRL_MASK));
//设置的功能的快捷键为Ctrl+T
item1.setActionCommand("copy");
//设置出发item1事件后封装到事件中的一个为"copy"字符串
item2.setActionCommand("cut");
//设置出发item2事件后封装到事件中的一个为"cut"字符串
item3.setActionCommand("paste");
//设置出发item3事件后封装到事件中的一个为"paste"字符串
item6.setActionCommand("gray");
//设置出发item6事件后封装到事件中的一个为"gray"字符串
item7.setActionCommand("pink");
//设置出发item7事件后封装到事件中的一个为"pink"字符串
item8.setActionCommand("white");
//设置出发item8事件后封装到事件中的一个为"white"字符串
item9.setActionCommand("red");
//设置出发item9事件后封装到事件中的一个为"red"字符串
item10.setActionCommand("black");
//设置出发item10事件后封装到事件中的一个为"black"字符串
item11.setActionCommand("green");
//设置出发item11事件后封装到事件中的一个为"green"字符串
item12.setActionCommand("yellow");
//设置出发item12事件后封装到事件中的一个为"yellow"字符串
			menu2.add(item1);//添加菜单项
			menu2.addSeparator();//设置分格条,下面的都一样
			menu2.add(item2);
			menu2.addSeparator();
			menu2.add(item3);
			menu1.add(item4);
			menu1.addSeparator();
			menu1.add(item5);
			menu1.addSeparator();
			menu1.add(item29);
			menu3.add(item13);
			menu3.addSeparator();
			menu3.add(item14);
			menu3.addSeparator();
			menu3.add(item15);
			menu3.addSeparator();
			menu3.add(item16);
			menu3.addSeparator();
			menu3.add(item17);
		    menu3.addSeparator();
			menu3.add(item18);
			menu4.add(item6);
			menu4.addSeparator();
			menu4.add(item7);
			menu4.addSeparator();
			menu4.add(item8);
			menu4.addSeparator();
			menu4.add(item9);
			menu4.addSeparator();
			menu4.add(item10);
			menu4.addSeparator();
			menu4.add(item11);
			menu4.addSeparator();
			menu4.add(item12);
			menu6.add(item19);
			menu6.addSeparator();
			menu6.add(item20);
			menu6.addSeparator();
			menu6.add(item21);
			menu7.add(item22);
			menu7.addSeparator();
			menu7.add(item23);
			menu7.addSeparator();
			menu7.add(item24);
			menu7.addSeparator();
			menu7.add(item25);
			menu8.add(item26);
			menu9.add(item27);
			menu5.add(menu3);
			menu5.add(menu6);
			menu5.add(menu7);
		    menu5.add(menu8);
		    menubar.add(menu1);
			menubar.add(menu2);
			menubar.add(menu4);
			menubar.add(menu5);
			menubar.add(menu9);
			setJMenuBar(menubar);//设置菜单条
HandleListener handleListener=new  HandleListener();//创建复制、剪切、粘贴监视器对象
colorListener=new BackgroundColorListener();//创建灰、粉、白、红、黑、绿、黄监视器对象
handleListener.setInputText(area);
colorListener.setInputText(area);
item1.addActionListener(handleListener);//item1将handleListener注册为监视器
item2.addActionListener(handleListener);//item2将handleListener注册为监视器
item3.addActionListener(handleListener);//item3将handleListener注册为监视器
item4.addActionListener(this);//动作监视器this是指当前对象,不能被子类继承
item5.addActionListener(this);
item29.addActionListener(this);
item6.addActionListener(colorListener);//item6将colorListener注册为监视器
item7.addActionListener(colorListener);//item7将colorListener注册为监视器
item8.addActionListener(colorListener);//item8将colorListener注册为监视器
item9.addActionListener(colorListener);//item9将colorListener注册为监视器
item10.addActionListener(colorListener);//item10将colorListener注册为监视器
item11.addActionListener(colorListener);//item11将colorListener注册为监视器
item12.addActionListener(colorListener);//item12将colorListener注册为监视器
item13.addActionListener(this);//动作监视器this是指当前对象
item14.addActionListener(this);
item15.addActionListener(this);
item16.addActionListener(this);
item17.addActionListener(this);
item18.addActionListener(this);
item19.addActionListener(this);
item20.addActionListener(this);
item21.addActionListener(this);
item22.addActionListener(this);
item23.addActionListener(this);
item24.addActionListener(this);
item25.addActionListener(this);
item26.addActionListener(this);
item27.addActionListener(this);
item28.addActionListener(this);
}
//下面是实现菜单里菜单项新建和保存的功能的方法
public void actionPerformed(ActionEvent e){
if(e.getSource()==item4){//监听"新建”事件
int state=fileDialog.showOpenDialog(this);// 显示文件选取的对话框
if(state==JFileChooser.APPROVE_OPTION){// 如果使用者按下确认键
{area.setText(null);//将文本清空
	area.setBackground(Color.white);
area.setForeground(Color.black);}
try{ 
File dir=fileDialog.getCurrentDirectory();//获取当前对话框
String name=fileDialog.getSelectedFile().getName();
File file=new File(dir,name);//获取目录和文件名
fileReader=new FileReader(file);
in=new BufferedReader(fileReader);//创建文件的输出流
String s=null;
while((s=in.readLine())!=null){//从文件中读取一行文本
area.append(s+"\n");}
in.close();
fileReader.close();//关闭输入流
 }
catch(IOException exp){}//捕获文件读写发生的异常
}
else if(e.getSource()==item5){//监听保存事件
    int state=fileDialog.showSaveDialog(this);
if(state==JFileChooser.APPROVE_OPTION){
         try{
           File dir=fileDialog.getCurrentDirectory();//获取当前对话框
            String name=fileDialog.getSelectedFile().getName();
            File file=new File(dir,name);
            fileWriter=new FileWriter(file);//写入字符文件
            out=new BufferedWriter(fileWriter);//将文本写入字符输出流
            out.write(area.getText());//获取文本区文字写入目的地
out.flush();//强制把缓冲区里的内容写到目的地
            out.close();
            fileWriter.close();//关闭
            }
           catch(IOException exp){}//捕获文件读写发生的异常
	   }
}
else if(e.getSource()==item29){//监听"打开"事件
        int state=fileDialog.showOpenDialog(this);
        if(state==JFileChooser.APPROVE_OPTION){
             area.setText(null);
        try{
            File dir=fileDialog.getCurrentDirectory();
            String name=fileDialog.getSelectedFile().getName();
            File file=new File(dir,name);
            fileReader=new FileReader(file);
            in=new BufferedReader(fileReader);
   String s=null;
		    while((s=in.readLine())!=null){
				area.append(s+"\n");}
                in.close();
                fileReader.close();//关闭流
            }
         catch(IOException exp){}//捕获文件读写发生的异常}	
else if(e.getSource()==item13){//监听"文字粉色"事件
	area.setForeground(Color.pink);
}
else if(e.getSource()==item14){//监听"文字白色"事件
	area.setForeground(Color.white);
}
else if(e.getSource()==item15){//监听"文字红色"事件
	area.setForeground(Color.red);
}
else if(e.getSource()==item16){//监听"文字黑色"事件
	area.setForeground(Color.black);
}
else if(e.getSource()==item17){//监听"文字绿色"事件
	area.setForeground(Color.green);
}
else if(e.getSource()==item18){//监听"文字黄色"事件
	area.setForeground(Color.yellow);
}
else if(e.getSource()==item19){//监听"Size30"事件
    area.setFont(new Font("宋体",0,30));
}
else if(e.getSource()==item20){//监听"Size40"事件
	area.setFont(new Font("宋体",0,40));
}
else if(e.getSource()==item21){//监听"Size50"事件
	area.setFont(new Font("宋体",0,50));
}
else if(e.getSource()==item22){//监听"文字加粗"事件
	area.setFont(new Font("宋体",1,20));
}
else if(e.getSource()==item23){//监听"楷体"事件
	area.setFont(new Font("楷体",0,20));
}
else if(e.getSource()==item24){//监听"华文新魏"事件
	area.setFont(new Font("华文新魏",0,20));
}
else if(e.getSource()==item24){//监听"行书"事件
	area.setFont(new Font("行书",0,20));
}
else if(e.getSource()==item26){//监听"恢复原设置"事件
{
	area.setFont(new Font("宋体",0,20));
	area.setBackground(Color.white);
	area.setForeground(Color.black);
			}
		}
else if(e.getSource()==item28){监听"退出"事件
	area.setText(null);
}
else if(e.getSource()==item27){监听"相关提示"事件
{ 
	area.setBackground(Color.pink);//默认背景颜色为白色
	area.setForeground(Color.black);//默认字体颜色为黑色
area.setFont(new Font("新文华谓",1,20));
area.append("该程序存在很多不足之处,建议使用前建议查询该网站了解相关信息\n");
area.append("该网址是:https://...\n");
int n=JOptionPane.showConfirmDialog(this,"您是否要复制该网址","温馨提示",JOptionPane.YES_NO_OPTION);//显示确认对话框
if(n==JOptionPane.YES_OPTION){//用户单击对话框上的按钮“是”
area.append("【注意】1、复制网址后,使用快捷键Ctrl+T,也可以继续编写文件。\n");
area.append("谢谢您的使用!");
}
if(n==JOptionPane.NO_OPTION)//用户单击对话框上的按钮“是”
	area.setText(null);
		}
	}
  }
}
BackgroundColorListener.java
//BackgroundListener
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
//下面是实现背景颜色设置功能的方法
public class BackgroundColorListener  implements ActionListener{
JTextArea area;
public void setInputText(JTextArea text){
area=text;
}
public void actionPerformed(ActionEvent e){
String str=e.getActionCommand();
if(str.equals("gray"))
area.setBackground(Color.gray);
else if(str.equals("pink"))
area.setBackground(Color.pink);
else if(str.equals("white"))
area.setBackground(Color.white);
else if(str.equals("black"))
area.setBackground(Color.black);
else if(str.equals("green"))
   area.setBackground(Color.green);
else if(str.equals("yellow"))
 area.setBackground(Color.yellow);
else if(str.equals("red"))
area.setBackground(Color.red);}
}
HandleListener.java
//HandleListener类
import java.awt.event.*;
import javax.swing.*;
//下面是实现工具里菜单项”复制”、剪切和粘贴的功能的方法
public class HandleListener  implements ActionListener{
JTextArea area;
public void setInputText(JTextArea text){
area=text;
}
public void actionPerformed(ActionEvent e){
String str=e.getActionCommand();
if(str.equals("copy"))
	area.copy();
else if(str.equals("cut"))
	area.cut();
else if(str.equals("paste"))
	area.paste();
}
}

4.1问题及解决办法
(1)在文本区加入滚动条,该语句是:JScrollPane p=new JscrollPane();area.add§;运行后发现并没有滚动条;在看书查询后知道了不能直接添加,需要将窗格添加到面板,再将面板添加到文本区,这样才能成功的加入滚动条;后来被语句改为最简短的语add(new JScrollPane(area),BorderLayout.CENTER);
滚动条已加入文本区。
(2)为了是该记事本增加背景颜色和字体颜色的功能,一开始想一种颜色用一个菜单项就可以加入到菜单“背景”和“字体”中的,经过好多次运行发现这种办法是不可行的。后来只能多创建几个菜单项来分别引用。
(3)在实现新建、保存和打开的功能的方法时,原打算和实现复制剪切粘贴功能一样新建一个java文件来实现这些功能的;运行后发现不可行,getActionCommand()对于文本框,当发生ActionEvent事件时,默认的字符串是文本框中的文本,并不是事件源对象的引用;因此就用关键字this作为新建、保存和打开的监视器,this指的是当前对象,可以调用getSource()方法可以获取发生ActionListener事件的事件源对象的引用,这样才能调用getCurrentDirectory()、showOpenDialog()等方法,这样才能实现新建、保存和粘贴功能。
4.2存在不足
(1)功能不全面,背景颜色不能保存到文件中
(2)在增加字体这一功能设计还不够好
(3)代码太长,不够精简
五 心得体会
经过努力,基本上完成我的Java课程设计一简单的记事本程序。也基本上实现了老师需求分析时所预期的功能。在这次课程设计中,我遇到了很多问题,也学会了解决这些问题的方法。通过这次的课程设计,使将我从技本上学习到的理论知识用到了实践上.从而进一步巩固和丰富了我所学过的知识,让我更深层次地认识到Java及其强大的功能。虽然过程有点难,但做这Java课程设计也进-步加强了我的动手能力和提高了我的兴趣。为了完成好这次课程设计,我一边上网查找相关资料,另一方面查阅相关书籍。在这过程中也无形中锻炼了我的思维分析、遇到问题及想方设法通过各种途径解决问题的能力。

第一次写博客文章,有很多不足,希望大家多多指教

 类似资料: