Java实现记事本
来源:互联网 发布:什么牌子沙发好 知乎 编辑:程序博客网 时间:2024/06/03 10:43
本文程序来自《Java从入门到精通》
package futuremaster.com;import java.awt.*;import java.awt.datatransfer.*;import java.awt.event.*;import java.io.*;public class Notebook extends Frame{MenuBar menuBar=new MenuBar();TextArea textArea=new TextArea();//文件菜单Menu fileMenu=new Menu("文件");//创建,并初始化菜单栏menuBarMenu editMenu=new Menu("编辑");//创建,并初始化文本区textAreaMenuItem newItem =new MenuItem("新建");MenuItem openItem =new MenuItem("打开");MenuItem saveItem=new MenuItem("保存");MenuItem saveAsItem=new MenuItem("另存");MenuItem exitItem=new MenuItem("退出");MenuItem selectItem=new MenuItem("全选");MenuItem copyItem=new MenuItem("复制");MenuItem cutItem=new MenuItem("剪贴");MenuItem pasteItem=new MenuItem("粘贴"); String fileName="NoName.txt";//设置默认的文件名 Toolkit toolKit=Toolkit.getDefaultToolkit();//获取默认工具包 Clipboard clipBoard=toolKit.getSystemClipboard();//获取剪切板对象private FileDialog openFileDialog=new FileDialog(this,"Open File",FileDialog.LOAD); private FileDialog saveAsFileDialog=new FileDialog(this,"Save File As",FileDialog.SAVE); public Notebook(){ setTitle("Notepad"); setFont(new Font("Times New Roman",Font.PLAIN,12));//设置字体 setBackground(Color.white);//设置背景色 setSize(600,400);//设置窗口大小 fileMenu.add(newItem);//在菜单中添加“新建”菜单项 fileMenu.add(openItem); fileMenu.addSeparator();//在菜单中添加分割线 fileMenu.add(saveItem); fileMenu.add(saveAsItem); fileMenu.addSeparator(); fileMenu.add(exitItem); editMenu.add(selectItem); editMenu.addSeparator(); editMenu.add(cutItem); editMenu.add(cutItem); editMenu.add(pasteItem); menuBar.add(fileMenu); menuBar.add(editMenu); setMenuBar(menuBar);//为窗口添加菜单栏 add(textArea);//为窗口添加textArea addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); newItem.addActionListener(new EventHandler());// 事件绑定 openItem.addActionListener(new EventHandler()); saveItem.addActionListener(new EventHandler()); saveAsItem.addActionListener(new EventHandler()); exitItem.addActionListener(new EventHandler()); selectItem.addActionListener(new EventHandler()); copyItem.addActionListener(new EventHandler()); cutItem.addActionListener( new EventHandler()); pasteItem.addActionListener(new EventHandler()); } //事件处理 class EventHandler implements ActionListener{ public void actionPerformed(ActionEvent e){ Object eventSource=e.getSource(); if(eventSource==newItem){ textArea.setText(""); }else if(eventSource==openItem) { openFileDialog.setVisible(true); fileName=openFileDialog.getDirectory()+openFileDialog.getFile(); if(fileName!=null) readFile(fileName); }else if(eventSource==saveItem) { openFileDialog.setVisible(true); fileName=openFileDialog.getDirectory()+openFileDialog.getFile(); if(fileName!=null) writeFile(fileName); }else if(eventSource==saveAsItem) { saveAsFileDialog.setVisible(true); fileName=saveAsFileDialog.getDirectory()+saveAsFileDialog.getFile(); if(fileName!=null) writeFile(fileName); }else if(eventSource==selectItem) { textArea.selectAll(); }else if(eventSource==copyItem) { String text=textArea.getSelectedText(); StringSelection selection=new StringSelection(text); clipBoard.setContents(selection,null); }else if(eventSource==cutItem) { String text=textArea.getSelectedText(); StringSelection selection =new StringSelection(text); clipBoard.setContents(selection,null); textArea.replaceRange("",textArea.getSelectionStart(),textArea.getSelectionEnd()); }else if(eventSource==pasteItem) { Transferable contents=clipBoard.getContents(this); if(contents==null)return; String text; text=""; try { text=(String)contents.getTransferData(DataFlavor.stringFlavor); }catch(Exception exception){} textArea.replaceRange(text,textArea.getSelectionStart(),textArea.getSelectionEnd());//用于指定替换 }else if(eventSource==exitItem){ System.exit(0); } }// 写文件private void writeFile(String fileName) {try{File file = new File(fileName);FileWriter writeOut = new FileWriter(file);writeOut.write(textArea.getText());//将文本区内容写入文件writeOut.close();}catch(IOException e){//捕获异常System.out.println("Error writing file");}}//读文件private void readFile(String fileName) {try{File file = new File(fileName);//创建,初始化File对象fileFileReader readln = new FileReader(file);//由file对象创建FileReader对象int size = (int)file.length();//返回文件长度int charsRead = 0;//创建,初始化整型数据charsReadchar[] content = new char[size];//创建字符类型数组while(readln.ready())//循环读流数据charsRead += readln.read(content,charsRead,size-charsRead);//读出文件字符readln.close();//关闭readln对象textArea.setText(new String(content,0,charsRead));//设置文本区内容}catch(IOException e){System.out.println("Error opening File");//输出字符串信息}} }}
1.菜单栏的“文件”“编辑”选项是怎么实现的?
2.菜单项的“新建”、“打开”、“保存”、“另存”、“退出”、“全选”、“复制”、“剪贴”、“粘贴”功能的实现细节是怎么样的?
3.“退出”直接用System.exit(0)可以吗?
4.怎么这个程序可以生成一个这样的有编辑窗口的图形界面,是继承了什么类吗?
5.这是applet还是application?
6.是否要自行实现换行,如果是那怎么实现?
7.Toolkit是什么?
8.Clipboard又是什么?
9.背景色为什么是白色的?
答:
1.先用Menu fileMenu=new Menu(“文件”)语句生成一个文件对象,然后在构造器里用Menu.add(MenuItem)添加到文件菜单的下拉列表里。编辑栏同理。
2.这些都是菜单项目,前面已经用MenuItem类生成相应对象→然后调用此对象的addActionListener(ActionListener)方法→因为ActionListener只是一个接口,要定义一个类来实现这个接口(class EventHandler implements ActionListener)→重写ActionListener.actionPerformed(ActionEvent)→调用ActionEvent.getSource()获取事件源→
(1)新建文件:TextArea.setText(""),设置文本内容为“”;
(2)打开文件:
查看手册:
FileDialog(Dialog parent, String title, int mode)
创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。
所以private FileDialog openFileDialog=new FileDialog(this,"Open File",FileDialog.LOAD),定义一个用于打开文件的对话框,在需要的时候使用FileDialog.setVisible(true),再用FileDialog.getDirectory和FileDialog.getFile()获取文件名和路径,因为之后readFile(filename)加载文件内容。
readFile(filename)是自己定义的函数,这函数主要通过FileReader.read()和TextArea.setText()完成。
手册中的FileReader.read()如下:
read
public abstract int read(char[] cbuf,
int off,
int len)
throws IOException将字符读入数组的某一部分。在某个输入可用、发生 I/O 错误或者到达流的末尾前,此方法一直阻塞。
参数:
cbuf - 目标缓冲区
off - 开始存储字符处的偏移量
len - 要读取的最多字符数
返回:
读取的字符数,如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误
将读出来的cbuf写到文本窗的方法为TextArea.setText(cbuf)。
(3)保存文件:和打开文件一样,也要一个对话框,然后,自己写一个writeFile(filename)函数,用FileWriter.write(String)和TextArea.getText()实现。
(4)另存为:与保存文件一样
(5)全选:调用textArea.selectAll()
(6)复制:调用TextArea.getSelectedText()选中文字段,把选中的内容封装到StringSelection对象中,然后调用public void setContents(Transferable contents,ClipboardOwner owner)把内容传给ClipBoard。
(7)剪切:与复制一样,不过要外加一步用(TextArea类方法)public void replaceRange(String str,int start,int end)把选中文本置空。
(8)粘贴:与剪切相反,先把ClipBoard中的内容用clipBoard.getContents()提取出来装进Transferable(数据传输操作接口)实例中。再用Object getTransferData(DataFlavor flavor)返回将要被传输的数据存入String对象中。最后用replaceRange()向TextArea填入字符串。
(9)退出直接用exit(0)。
3.目前只知道在exit的时候用一个线程来做一些释放工作,但是具体是什么还是不懂,留着以后更新吧
4.继承了Frame类,一个具有标题和边框的类,然后在类中new一个TextArea类。
5.主要是用Frame建立的图形界面,所以是一个Applet。
6.这里没有实现换行功能,请恕晚辈愚钝,不懂怎么做,以后再更新。
7.手册中说:大多数应用程序不应直接调用该类中的任何方法。Toolkit 定义的方法是一种“胶水”,将 java.awt 包中与平台无关的类与 java.awt.peer 中的对应物连接起来。Toolkit 定义的一些方法能直接查询本机操作系统。
本程序主要用来获取ClipBoard(剪切板)。
8.ClipBoard是系统的剪贴板,提供剪贴的功能接口
9.Frame类有setBackground方法,在构造器中调用即可。
- Java 实现记事本
- Java简单记事本实现
- Java实现记事本
- java实现记事本
- java实现记事本
- java实现记事本
- Java记事本实现
- Java实现记事本
- java Swing 实现记事本
- java GUI实现记事本
- java实现图形记事本
- java实现记事本之Java记事本源码及实现
- java实现记事本之Java记事本源码及实现
- java实现记事本之Java记事本源码及实现
- Java实现记事本功能:JNotePad
- NoteBook Java实现记事本功能
- java实现我的记事本
- Java实现记事本知识小结
- 生成验证码工具类
- Java性能调优的11个实用技巧
- 实战cetons中搭建phpmyadmin
- 布局(一)float/absolute/relative的原理
- Word2vec安装使用
- Java实现记事本
- JAVA编程思想--接口
- Spring AOP随笔(一)
- tf 深入Time和TF
- day171、正则表达式的定义及使用 2、Date类的用法 3、Calendar类的用法
- JavaScript Closure Memorization
- centos7 安装java和tomcat9
- 11.3课堂笔记和作业
- X11简介及Xlib参考手册地址