利用Java制作仿Windows记事本(功能齐全)

由于期末降至,每年的学校的实训也开始了,实训当然不是每天工地搬砖啊!

嗯,今年的实训是利用Java去制作各种各样的东西,有仿Windows记事本,有网页浏览器制作,有日历记事本,还有连连看游戏制作,嗯,当然不是全部都做啊,那就来不及了,毕竟学校也是有时间限制的,就三四天时间。我的话,抽到的题目是Windows记事本的制作!!

额,顺便说一句,寒假里我要是有空的话,我会继续更的,把各种浏览器连连看的也都做一遍,把代码都发上来,希望我时间足够吧。

好了好了,废话到此结束。想直接拿代码的去文章最后!!!

======================一条正经的分割线====================

制作记事本,嗯,可以分为五个步骤:


这五个步骤,界面制作,布局设计,监视器设置,功能函数编写,最后就是调试了,虽然花了很久,但是最终最出来的东西还是有缺憾,在个别功能上有欠缺,也懒得再改,大家可以在我的代码基础上继续改!加油。。。少年。。。额,又开始瞎BB了。。。。依旧回到正经!

界面的设置,成果图大概是这样:


啊,首先是页面的设置代码如下:

private JMenuBar menuBar; 	//菜单条
	private JMenu fileMenu;		//文件菜单
	private JMenu editMenu;		//编辑菜单
	private JMenu formatMenu;	//格式菜单
	private JMenu viewMenu;		//查看菜单
	private JMenu helpMenu;		//帮助菜单
	
	private NotePadFrame f;
	
	private JTextArea jTextArea;	//文本区域
	private JScrollPane jScrollPane;		//滚动条
	//文件菜单内四项
	private JMenuItem openItem, closeItem, saveItem,aboutItem;	
	private JMenuItem newItem, savetoItem;		//新建项目,另存为项目
	//编辑菜单中的所有项目
	private JMenuItem editUndo, editCut, editCopy, editPaste, editDelete, editFind, editFindnext, editReplace, editGoto, editAll, editDates;
	//格式菜单下的项目
	private JMenuItem formatFont;		//字体
	private JCheckBoxMenuItem formatLinewrap;	//自动换行
	//查看菜单下的项目
	private JCheckBoxMenuItem Status;
	
	private FileDialog open,save;		//定义一个打开文件和保存文件
	private File file;  	//定义一个文件
	
	String fileName,copy,paste,cut;

以上,就是所有的菜单,以及子菜单的建立。

嗯,所有的子菜单都新建了,然后就是初始化:

初始化代码如下:

public void Init(){		
		JFrame frame = new JFrame("Wangha's Text");		//建立一个名为记事本·伪的窗口
		frame.setBounds(300, 300, 700, 450);		//窗口位置在300,300,窗口大小为700*450
		frame.setDefaultCloseOperation(EXIT_ON_CLOSE);		//
		
		menuBar = new JMenuBar();		//初始化菜单栏
		fileMenu = new JMenu("文件");		//初始化名为文件的文件菜单
		editMenu = new JMenu("编辑");		//初始化编辑菜单
		formatMenu = new JMenu("格式");	//初始化格式菜单
		viewMenu = new JMenu("查看");		//初始化查看菜菜的那
		helpMenu = new JMenu("帮助");		//初始话名为帮助的帮助菜单
		
//		Document doc = jTextArea.getDocument();
		
		jTextArea = new JTextArea(10, 40);		//10行40列
		Font x = new Font("Monospaced",1,20);	//定义字体大小以及一些属性
		
		jTextArea.setFont(x);		//只能使用x这种字体
		jTextArea.setLineWrap(true);//到达指定宽度则换行
		//应当首先利用构造函数指定JScrollPane的控制对象,此处为JTextArea,然后再讲JScrollPane
		
		jScrollPane = new JScrollPane(jTextArea);	//将滚动条添加进面板
		//设置滚动条自动出现
		jScrollPane.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); //水平
		jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //竖直
		jScrollPane.setViewportView(jTextArea);
		
		jTextArea.getDocument().addUndoableEditListener(undo);	
		
		//定义文件菜单内部的功能菜单
		newItem = new JMenuItem("新建");
		openItem = new JMenuItem("打开");
		saveItem = new JMenuItem("保存");
		savetoItem = new JMenuItem("另存为");
		closeItem = new JMenuItem("关闭");
		//定义编辑菜单内部项目
		editUndo = new JMenuItem("撤销");
		editCut = new JMenuItem("剪切");
		editCopy = new JMenuItem("复制");
		editPaste = new JMenuItem("粘贴");
		editDelete = new JMenuItem("删除");
		editFind = new JMenuItem("查找");
		editReplace = new JMenuItem("替换");
		editGoto = new JMenuItem("转到");
		editAll = new JMenuItem("全选");
		editDates = new JMenuItem("时间");
		//格式菜单
		formatFont = new JMenuItem("字体");
		formatLinewrap = new JCheckBoxMenuItem("自动换行");
		//查看菜单
		Status = new JCheckBoxMenuItem("状态栏");
		//帮助菜单
		aboutItem = new JMenuItem("关于");
		
		//添加两个选项卡到JMenu
		//添加子菜单项到菜单项
		menuBar.add(fileMenu);
		menuBar.add(editMenu);
		menuBar.add(formatMenu);
		menuBar.add(viewMenu);
		menuBar.add(helpMenu);
		
		fileMenu.add(newItem);
		fileMenu.add(openItem);
		fileMenu.add(saveItem);
		fileMenu.add(savetoItem);
		fileMenu.add(closeItem);	
		editMenu.add(editUndo);
		editMenu.add(editCut);
		editMenu.add(editCopy);
		editMenu.add(editPaste);
		editMenu.add(editDelete);
		editMenu.add(editFind);
		editMenu.add(editReplace);
		editMenu.add(editGoto);
		editMenu.add(editAll);
		editMenu.add(editDates);
		formatMenu.add(formatLinewrap);
		formatMenu.add(formatFont);
		viewMenu.add(Status);
		helpMenu.add(aboutItem);
		//放置菜单项及输入框
		
		frame.add(menuBar, BorderLayout.NORTH);
		frame.add(jScrollPane, BorderLayout.CENTER);
		
		statusLabel=new JLabel(" 按F1获取帮助");
		frame.add(statusLabel,BorderLayout.SOUTH);//向窗口添加状态栏标签
		statusLabel.setVisible(false);

		//FileDialog 类显示一个对话框窗口,用户可以从中选择文件。 
		//由于它是一个模式对话框,当应用程序调用其 show 方法来显示对话框时,它将阻塞其余应用程序,直到用户选择一个文件。 
		open = new FileDialog(frame,"打开文档",FileDialog.LOAD);	//打开文档时候的界面
	    save = new FileDialog(frame,"保存文档",FileDialog.SAVE); 	//保存文档时候的界面
		
	    Event();												//四个按钮的监听
	    frame.setVisible(true);									//显示界面
	    
	}
对,你想的没错,上面有一个Event();事件,他就是监视器的设置,以及事件的处理函数。

具体函数的话,由于篇幅很长,我将一些特别长的函数直接单独拿出来边长一个函数,有如下几个:

第一个:public JTextArea getTa()

public JTextArea getTa() {
		  return jTextArea;
		 }
代码超级长有没有!!!

第二个:public void checkMenuItemEnabled()

public void checkMenuItemEnabled()
	{ String selectText=jTextArea.getSelectedText();
	if(selectText==null)
	{ editCut.setEnabled(true);
//	popupCut.setEnabled(false);
	editCopy.setEnabled(true);
//	popupCopy.setEnabled(false);
	editDelete.setEnabled(true);
//	popupMenu_Delete.setEnabled(false);
	}
	else
	{ editCut.setEnabled(true);
//	popupMenu_Cut.setEnabled(true); 
	editCopy.setEnabled(true);
//	popupMenu_Copy.setEnabled(true);
	editDelete.setEnabled(true);
//	popupMenu_Delete.setEnabled(true);
	}
	}
嗯,第三个,这就长了,public void find(),嗯,这个查找是我在网上查到的替换进行了更改,然后形成的:

public void find()
		{ final JDialog findDialog=new JDialog(this,"查找",false);//false时允许其他窗口同时处于激活状态(即无模式)
		Container con=findDialog.getContentPane();//返回此对话框的contentPane对象 
		con.setLayout(new FlowLayout(FlowLayout.LEFT));
		JLabel findContentLabel=new JLabel("查找内容(N):");
		final JTextField findText=new JTextField(15);
		JButton findNextButton=new JButton("查找下一个(F):");
		final JCheckBox matchCheckBox=new JCheckBox("区分大小写(C)");
		ButtonGroup bGroup=new ButtonGroup();
		final JRadioButton upButton=new JRadioButton("向上(U)");
		final JRadioButton downButton=new JRadioButton("向下(U)");
		downButton.setSelected(true);
		bGroup.add(upButton);
		bGroup.add(downButton);
		/*ButtonGroup此类用于为一组按钮创建一个多斥(multiple-exclusion)作用域。
		使用相同的 ButtonGroup 对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮。*/
		/*JRadioButton此类实现一个单选按钮,此按钮项可被选择或取消选择,并可为用户显示其状态。
		与 ButtonGroup 对象配合使用可创建一组按钮,一次只能选择其中的一个按钮。
		(创建一个 ButtonGroup 对象并用其 add 方法将对象包含在此组中。)*/
		JButton cancel=new JButton("取消");
		//取消按钮事件处理
		cancel.addActionListener(new ActionListener()
		{ public void actionPerformed(ActionEvent e)
		{ findDialog.dispose();		//将查找窗口释放内存,也就是关闭
		}
		});
		//"查找下一个"按钮监听
		findNextButton.addActionListener(new ActionListener()
		{ public void actionPerformed(ActionEvent e)
		{ //"区分大小写(C)"的JCheckBox是否被选中
		int k=0,m=0;
		final String str1,str2,str3,str4,strA,strB;
		str1=jTextArea.getText();
		str2=findText.getText();
		str3=str1.toUpperCase();
		str4=str2.toUpperCase();
		if(matchCheckBox.isSelected())//区分大小写
		{ strA=str1;
		 strB=str2;
		}
		else//不区分大小写,此时把所选内容全部化成大写(或小写),以便于查找 
		{ strA=str3;
		 strB=str4;
		}
		if(upButton.isSelected())
		{ //k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);
		 if(jTextArea.getSelectedText()==null)
		 k=strA.lastIndexOf(strB,jTextArea.getCaretPosition()-1);//在strA中查找strB,往后查找
		 else
		 k=strA.lastIndexOf(strB, jTextArea.getCaretPosition()-findText.getText().length()-1); //往前查找
		 if(k>-1)
		 { //String strData=strA.subString(k,strB.getText().length()+1);
		 jTextArea.setCaretPosition(k);		//选中字符串
		 jTextArea.select(k,k+strB.length());
		 }
		 else
		 { JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);
		 }
		}
		else if(downButton.isSelected())
		{ if(jTextArea.getSelectedText()==null)
		 k=strA.indexOf(strB,jTextArea.getCaretPosition()+1);//index 返回第一个索引的位置,从这个位置开始搜索
		 else
		 k=strA.indexOf(strB, jTextArea.getCaretPosition()-findText.getText().length()+1); 
		 if(k>-1)
		 { //String strData=strA.subString(k,strB.getText().length()+1);
		 jTextArea.setCaretPosition(k);
		 jTextArea.select(k,k+strB.length());
		 }
		 else
		 { JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);
		 }
		}
		}
		});//"查找下一个"按钮监听结束
		//创建"查找"对话框的界面
		JPanel panel1=new JPanel();
		JPanel panel2=new JPanel();
		JPanel panel3=new JPanel();
		JPanel directionPanel=new JPanel();
		directionPanel.setBorder(BorderFactory.createTitledBorder("方向"));
		//设置directionPanel组件的边框;
		//BorderFactory.createTitledBorder(String title)创建一个新标题边框,使用默认边框(浮雕化)、默认文本位置(位于顶线上)、默认调整 (leading) 以及由当前外观确定的默认字体和文本颜色,并指定了标题文本。
		directionPanel.add(upButton);
		directionPanel.add(downButton);
		panel1.setLayout(new GridLayout(2,1));
		panel1.add(findNextButton);
		panel1.add(cancel);
		panel2.add(findContentLabel);
		panel2.add(findText);
		panel2.add(panel1);
		panel3.add(matchCheckBox);
		panel3.add(directionPanel);
		con.add(panel2);
		con.add(panel3);
		findDialog.setSize(410,180);
		findDialog.setResizable(false);//不可调整大小
		findDialog.setLocation(230,280);
		findDialog.setVisible(true);
	}//查找方法结束
接下来字体函数font(),这就更加长了,将近两百行。。。 大哭 大哭 大哭

public void font()
	{ final JDialog fontDialog=new JDialog(this,"字体设置",false);
	Container con=fontDialog.getContentPane();
	con.setLayout(new FlowLayout(FlowLayout.LEFT));
	JLabel fontLabel=new JLabel("字体(F):");
	fontLabel.setPreferredSize(new Dimension(100,20));//构造一个Dimension,并将其初始化为指定宽度和高度
	JLabel styleLabel=new JLabel("字形(Y):");
	styleLabel.setPreferredSize(new Dimension(100,20));
	JLabel sizeLabel=new JLabel("大小(S):");
	sizeLabel.setPreferredSize(new Dimension(100,20));
	final JLabel sample=new JLabel("Wangha's windowsText");
	final JTextField fontText=new JTextField(9);		//9列
	fontText.setPreferredSize(new Dimension(200,20));
	final JTextField styleText=new JTextField(8);
	styleText.setPreferredSize(new Dimension(200,20));
	final int style[]={Font.PLAIN,Font.BOLD,Font.ITALIC,Font.BOLD+Font.ITALIC};
	final JTextField sizeText=new JTextField(5);
	sizeText.setPreferredSize(new Dimension(200,20));
	JButton okButton=new JButton("确定");
	JButton cancel=new JButton("取消");
	cancel.addActionListener(new ActionListener()
	{ public void actionPerformed(ActionEvent e)
	{ fontDialog.dispose(); 
	}
	});
	Font currentFont=jTextArea.getFont();
	fontText.setText(currentFont.getFontName());
	fontText.selectAll();
	//styleText.setText(currentFont.getStyle());
	//styleText.selectAll();
	if(currentFont.getStyle()==Font.PLAIN)
	styleText.setText("常规");
	else if(currentFont.getStyle()==Font.BOLD)
	styleText.setText("粗体");
	else if(currentFont.getStyle()==Font.ITALIC)
	styleText.setText("斜体");
	else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))
	styleText.setText("粗斜体");
	styleText.selectAll();
	String str=String.valueOf(currentFont.getSize());
	sizeText.setText(str);
	sizeText.selectAll();
	final JList fontList,styleList,sizeList;
	GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
	final String fontName[]=ge.getAvailableFontFamilyNames();
	fontList=new JList(fontName);
	fontList.setFixedCellWidth(86);
	fontList.setFixedCellHei
  • 16
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值