Code
import java.lang.*;//默认导入,意思是导入java.lang包下的所有类,不能用java.lang;的方式。
import java.awt.*;
import java.io.*;
import java.awt.datatransfer.*;//数据流传输包?包括剪贴板、字符串发送器等。
import java.awt.event.*;
//extends Frame与javax.swing.JFrame;的区别是什么呢?
public class EditorFrame extends Frame implements ActionListener {
TextArea textArea = new TextArea();
MenuBar menuBar = new MenuBar();//菜单工具条
Menu fileMenu = new Menu("File");//菜单大项
MenuItem newItem = new MenuItem("New");//菜单小项,如何对应到大项呢?
MenuItem openItem = new MenuItem("Open");
MenuItem saveItem = new MenuItem("Save");
MenuItem saveAsItem = new MenuItem("Save As");
MenuItem exitItem = new MenuItem("Exit");
Menu editMenu = new Menu("Edit");
MenuItem selectItem = new MenuItem("Select All");
MenuItem copyItem = new MenuItem("Copy");
MenuItem cutItem = new MenuItem("Cut");
MenuItem pasteItem = new MenuItem("Paste");
String fileName = null;
Toolkit toolKit=Toolkit.getDefaultToolkit();//这是什么组件呢?java.awt.Toolkit;
Clipboard clipBoard=toolKit.getSystemClipboard();//剪贴板组件java.awt.datatransfer.Clipboard;
//打开与保存文件对话框,参数:this,"标题",文件对话框类型
private FileDialog openFileDialog= new FileDialog(this,"Open File",FileDialog.LOAD);
private FileDialog saveAsFileDialog= new FileDialog(this,"Save File As",FileDialog.SAVE);
//构造函数初始化
public EditorFrame(){
setTitle("NotePad");//Frame.setTitle("");
setFont(new Font("Times New Roman",Font.PLAIN,12));//设置字体时,需要新建一种字体
setBackground(Color.white);//设置颜色的参数:Color.white
setSize(400,300);
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(copyItem);
editMenu.add(cutItem);
editMenu.add(pasteItem);
menuBar.add(fileMenu);//在工具条上添加菜单大项
menuBar.add(editMenu);
setMenuBar(menuBar);//Frame.setMenuBar(menuBar);在窗体上添加工具条
add(textArea);
//为窗体添加事件代码,参数?事件代码?为什么只添加了关闭代码,没有最小化、最大化?默认自动实现?
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
newItem.addActionListener(this);
openItem.addActionListener(this);
saveItem.addActionListener(this);
saveAsItem.addActionListener(this);
exitItem.addActionListener(this);
selectItem.addActionListener(this);
copyItem.addActionListener(this);
cutItem.addActionListener(this);
pasteItem.addActionListener(this);
}
//actionPerformed的参数ActionEvent是用来收集组件事件的。
public void actionPerformed(ActionEvent e) {
Object eventSource = e.getSource();//Object类?可用来存储动作事件的事件源
if(eventSource == newItem){
textArea.setText("");
}else if(eventSource == openItem){
openFileDialog.show();//显示打开对话框
fileName = openFileDialog.getDirectory()+openFileDialog.getFile();//存储目录与文件字符串
if(fileName != null)
readFile(fileName);//读取文件方法
}else if (eventSource == saveItem){
if(fileName != null)
writeFile(fileName);//存储文件方法
}else if(eventSource == saveAsItem){
saveAsFileDialog.show();
fileName = saveAsFileDialog.getDirectory()+saveAsFileDialog.getFile();
if (fileName!= null)
writeFile(fileName);
}else if(eventSource == selectItem){
textArea.selectAll();//全选的方法
}else if(eventSource == copyItem){
String text=textArea.getSelectedText();//取得textArea所选取的字符
//java.awt.datatransfer.StringSelection把String转化成能被剪贴板使用的参数
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);
//剪贴的实现是用空字符串代替要剪贴的字符串,参数:Start()与End()
textArea.replaceRange("",textArea.getSelectionStart(),textArea.getSelectionEnd());
}else if(eventSource == pasteItem){
Transferable contents=clipBoard.getContents(this);//this当前对象引用,Transferable能够传输的内容
if(contents==null) return;
String text;
text="";
try{
text=(String)contents.getTransferData(DataFlavor.stringFlavor);//取得文件传输数据,强制转化为String
}catch(Exception exception){
}
textArea.replaceRange(text,textArea.getSelectionStart(),textArea.getSelectionEnd());
}else if(eventSource == exitItem){
System.exit(0);
}
}
public void readFile(String fileName){
try{
File file = new File(fileName);//File类,参数为代路径的文件名
FileReader readIn = new FileReader(file);//File内容读取类
int size = (int)file.length();//取得文件长度
int charsRead = 0;
char[] content = new char[size];//用字符数组存储文件内容
while(readIn.ready())//准备好了?有意思。如果没有字符串了,就没有ready好
//readIn.read重载方法一种,把已取得的字符传递给数组。size - charsRead相差,未能理解参数意义!!!
charsRead += readIn.read(content, charsRead, size - charsRead);
readIn.close();
textArea.setText(new String(content, 0, charsRead));//String类的一种重载方法,(数组,起始,结束)
}
catch(IOException e){
System.out.println("Error opening file");
}
}
public 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");
}
}
//比较好的编码结构,主函数很简练,调用其他。把主方法写在前面似乎更好。其他方法与主方法处于并列地位
public static void main(String[] args){
Frame frame = new EditorFrame();
frame.show();
}
}
java IO 经典实例入门
Code