一、问题描述
创建一个简单的记事本,包括打开,保存,退出菜单并能实现其操作。
二、思路
1、创建Frame窗体,对窗体进行基本设置 比如:大小,位置,布局
(1)创建Frame窗体:Frame f = new Frame("my window");
(2)对窗体设置大小:f.setBounds(x, y, width, height);
(3)设置窗体布局:f.setLayout(new FlowLayout());
2、先建立菜单栏,再建立“文件”菜单添加到菜单栏,并建立“打开”,”保存“,“退出”菜单项添加到菜单;
(1)创建菜单栏 MenuBar mb = new MenuBar();
(2)创建菜单Menum = new Menu("文件");
(3)创建菜单项
MenuItem saveItem = new MenuItem("保存");
MenuItemopenItem = new MenuItem("打开");
MenuItemcloseItem = new MenuItem("退出");
(4)将菜单项添加到菜单
m.add(openItem);
m.add(saveItem);
m.add(closeItem);
(5)将菜单添加到菜单栏
mb.add(m);
(6)将菜单栏添加到窗体
f.setMenuBar(mb);
3、设置动作监听事件,保存,打开,退出。
4、让窗体显示,通过setVisible(true)
三、具体代码实现
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class MyMenuTest
{
private Frame f;
private TextArea ta;
private MenuBar mb;
private Menu m;
private MenuItem closeItem, saveItem, openItem;
private FileDialog openDia, saveDia;
private File file;
MyMenuTest()
{
init();
}
public void init()
{f = new Frame("my window"); // 建立一个窗口
f.setBounds(300, 100, 500, 600);// 设大小位置
mb = new MenuBar();//创建菜单栏
ta = new TextArea();//创建文本区域
m = new Menu("文件");//创建菜单
saveItem = new MenuItem("保存");//创建保存菜单项
openItem = new MenuItem("打开");//创建打开菜单项
closeItem = new MenuItem("退出");//创建退出菜单项
//将保存、打开、退出菜单项添加到菜单中
m.add(openItem);
m.add(saveItem);
m.add(closeItem);
mb.add(m);将菜单项添加到菜单栏
f.setMenuBar(mb);//将菜单栏添加到窗体
f.add(ta);//将文本区域添加到窗体
openDia = new FileDialog(f, "我要打开", FileDialog.LOAD);// 此常量值指示文件对话框窗口的作用是查找要读取的文件。
saveDia = new FileDialog(f, "我要打开", FileDialog.SAVE);//这里必须是文件对话框, 因为Dialog中没有获取目录和文件的方法,此常量值指示文件对话框窗口的作用是查找要写入的文件。
myEvent();//监听事件
f.setVisible(true);//设置窗体可见
}
private void myEvent()//封装所有窗体
{//保存事件监听
saveItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{ if (file == null) //判断文件是否存在
{saveDia.setVisible(true);//设置保存对话框可见
String dirPath = saveDia.getDirectory();//定义文件路径
String filename = saveDia.getFile();//定义文件名
if (dirPath == null || filename == null) return;//如果路径或者文件名为空,直接返回
file = new File(dirPath, filename);//创建文件
}
try {
BufferedWriter bufw = new BufferedWriter(new FileWriter(file));//创建带缓冲区的写入流对象
String text = ta.getText();//定义字符串,获取文本内容
bufw.write(text);//将内容写入到缓冲区
bufw.close();//关闭缓冲区
}
catch (IOException ex) //异常处理
{
throw new RuntimeException();
}}});
openItem.addActionListener(new ActionListener() {//打开事件监听
public void actionPerformed(ActionEvent e)
{ openDia.setVisible(true);
ta.setText("");//清空文本区域的内容
String dirPath = openDia.getDirectory();
String filename = openDia.getFile();
if (dirPath == null || filename == null) return;
file = new File(dirPath, filename);
try {
BufferedReader bufr = new BufferedReader(new FileReader(file)); //创建带缓冲区的读取流对象
String line = null;
while ((line = bufr.readLine()) != null) //循环读取
{
ta.append(line + "\r\n");//添加到文本区域
}
bufr.close();//关闭缓冲区
}
catch (IOException e1)
{
throw new RuntimeException("读取失败");
}}});
closeItem.addActionListener(new ActionListener()//退出监听事件
{public void actionPerformed(ActionEvent e)
{
System.exit(0);//退出命令。结束程序
}});
f.addWindowListener(new WindowAdapter() //窗体监听事件
{public void windowClosing(WindowEvent e)
{System.exit(0);}});
}
public static void main(String[] args)
{
new MyMenuTest();//创建一个MyMenuTest对象
}
}
四、总结
本体涉及内容
1、GUI中一些基本对象的创建,例如创建Frame窗体,菜单栏,菜单,菜单项,文本区域等对象。
2、设置对象的一些监听事件,例如窗体监听事件,菜单项中保存,退出,修改一些监听事件。
3、IO流中缓冲区:为了提高效率使用了BufferedReader、BufferedWriter