import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class TestJMenuBar implements ActionListener {
private JFrame jf;
private JTextArea jta;
private JMenuBar jmb;
private boolean wasSaved=true;
private String filePath;
public TestJMenuBar() {
jf=new JFrame("记事本");
jta=new JTextArea(20,50);
jmb=new JMenuBar();
String[] jmLab={"文件","编辑","帮助"};
String[][] jmiLab={{"新建","打开","","保存","另存为","","退出"},
{"撤销","","剪切","复制","粘贴","","查找","替换"},
{"关于记事本"}};
for (int i = 0; i < jmLab.length; i++) {
JMenu jm=new JMenu(jmLab[i]);
for (int j = 0; j < jmiLab[i].length; j++) {
if("".equals(jmiLab[i][j])){
jm.addSeparator();
}else{
JMenuItem jmi=new JMenuItem(jmiLab[i][j]);
jmi.addActionListener(this);
jm.add(jmi);
}
}
jmb.add(jm);
}
}
private void init(){
JScrollPane jsp=new JScrollPane(jta);
jf.add(jsp);
jf.setJMenuBar(jmb);
}
private void addEventHandler(){
jf.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
if(false==wasSaved){
int op=JOptionPane.showConfirmDialog(jf, "文件没有保存是否退出?","确认退出",JOptionPane.YES_NO_CANCEL_OPTION);
if(op!=JOptionPane.YES_OPTION){
return;
}
}
System.exit(0);
}
});
jta.getDocument().addDocumentListener(new DocumentListener(){
public void changedUpdate(DocumentEvent e) {
wasSaved=false;
}
public void insertUpdate(DocumentEvent e) {
wasSaved=false;
}
public void removeUpdate(DocumentEvent e) {
wasSaved=false;
}
});
}
public void show(){
init();
addEventHandler();
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
public static void main(String[] args) {
new TestJMenuBar().show();
}
public void actionPerformed(ActionEvent e) {
String cmd=e.getActionCommand();
if("退出".equals(cmd)){
if(false==wasSaved){
int op=JOptionPane.showConfirmDialog(jf, "文件没有保存是否退出?","确认退出",JOptionPane.YES_NO_CANCEL_OPTION);
if(op!=JOptionPane.YES_OPTION){
return;
}
}
System.exit(0);
}
if("打开".equals(cmd)){
//文件选择器
FileDialog fd=new FileDialog(jf,"打开",FileDialog.LOAD);
fd.setVisible(true);
if(fd.getFile()==null){
return;
}
//文件路径为fd.getDirectory()+fd.getFile();
filePath=fd.getDirectory()+fd.getFile();
//只读utf-8编码的文本文件
//逐行读
//读一行,往文本域中写一行 文本域.append();
BufferedReader br=null;
try {
br=new BufferedReader(
new InputStreamReader(
new FileInputStream(filePath),"utf-8"));
String s=null;
while((s=br.readLine())!=null){
jta.append(s+"\n");
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if(br!=null){
try {
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
//wasSaved设置为true
wasSaved=true;
}
if("另存为".equals(cmd)){
FileDialog fd=new FileDialog(jf,"另存为",FileDialog.SAVE);
fd.setVisible(true);
if(fd.getFile()==null){
return;
}
filePath=fd.getDirectory()+fd.getFile();
save();
}
if("保存".equals(cmd)){
//如果filePath为null,表示新打开的记事本
if(filePath==null){
//通过FileDialog获得filePath
FileDialog fd=new FileDialog(jf,"另存为",FileDialog.SAVE);
fd.setVisible(true);
if(fd.getFile()==null){
return;
}
filePath=fd.getDirectory()+fd.getFile();
}
//将文本内容保存到filePath中
//wasSaved设置为true
save();
}
}
private void save() {
PrintWriter pw=null;
try {
pw=new PrintWriter(filePath,"utf-8");
pw.print(jta.getText());
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if(pw!=null){
pw.close();
}
}
wasSaved=true;
}
}