本文程序来自《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("文件");//创建,并初始化菜单栏menuBar
Menu editMenu=new Menu("编辑");//创建,并初始化文本区textArea
MenuItem 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对象file
FileReader readln = new FileReader(file);//由file对象创建FileReader对象
int size = (int)file.length();//返回文件长度
int charsRead = 0;//创建,初始化整型数据charsRead
char[] 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方法,在构造器中调用即可。
K讯 (kxun.top)