今天,在myeclipse平台上,编写了一个“文本文档”的编译器。本人也属于菜鸟级别,有如下心得。
创建一个名叫note的java工程,创建一个一个NOteUIt类,该类有JFrame派生。
创建全局变量:
private JMenuBar menuBar; //菜单栏
private JMenu fileMenu; //文件
private JMenu editMenu; //编辑
private JMenuItem open; //打开
private JMenuItem save; //保存
private JMenuItem saveAs; //另存为
private JMenuItem close; //关闭
private JMenuItem cut; //剪切
private JMenuItem copy; //复制
private JMenuItem paste; //粘粘
private JTextArea textArea; //轻量级组建,纯文本多行区域
private JLabel stateBar; //状态标签
private JFileChooser fileChooser; //为用户选择文件提供一种简单机制
private JPopupMenu popupMenu; //菜单弹出
编写编译器的框架结构:
public void initUI(){
setSize(800, 600);//设置窗口大小
setLocation(100, 50); //设置窗口在屏幕出现的位置
//文件菜单
fileMenu = new JMenu("文件");
open = new JMenuItem("打开");
//快捷键
save = new JMenuItem("保存");
//快捷键
saveAs = new JMenuItem("另存为");
close = new JMenuItem("退出");
//快捷键
fileMenu.add(open);
fileMenu.add(save);
fileMenu.add(saveAs);
fileMenu.add(close);
//编辑菜单
editMenu= new JMenu("编辑");
cut = new JMenuItem("剪切");
//快捷键
copy = new JMenuItem("复制");
//快捷键
paste = new JMenuItem("粘粘");
//快捷键
editMenu.add(cut);
editMenu.add(copy);
editMenu.add(paste);
//设置菜单栏
menuBar = new JMenuBar();
menuBar.add(fileMenu);
menuBar.add(editMenu);
setJMenuBar(menuBar);
//工作区域
textArea= new JTextArea();
textArea.setFont(new Font("宋体", Font.PLAIN , 16));//设置字体
textArea.setBackground(new Color(0, 255, 0)); //设置背景颜色
textArea.setLineWrap(true);
JScrollPane pane= new JScrollPane(textArea,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
Container contentPane=getContentPane();
contentPane.add(pane, BorderLayout.CENTER);
//状态栏
stateBar = new JLabel("未被修改");
stateBar.setHorizontalAlignment(SwingConstants.CENTER);
stateBar.setBorder(BorderFactory.createEtchedBorder());
contentPane.add(stateBar, BorderLayout.SOUTH);
popupMenu=editMenu.getPopupMenu();
fileChooser= new JFileChooser();
}
为按钮编写监听函数,做得比较粗糙,见谅:
private void setUpEventListener(){
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
try {
closeFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
open.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
openFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
save.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
saveFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
saveAs.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
saveFileAs();
}
});
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
closeFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
cut.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
cut();
}
});
copy.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
copy();
}
});
paste.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
paste();
}
});
}
实现监听函数的动作
private void openFile() throws IOException{
//判断文件是否保存
if(isCurrentFileSaved()){
open();
}else{
//显示对话框
int option = JOptionPane.showConfirmDialog(null,
"文件已修改,是否保存?","保存文件!",
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE,null);
switch(option){
case JOptionPane.YES_OPTION:
saveFile();
break;
case JOptionPane.NO_OPTION:
open();
break;
}
}
}
private boolean isCurrentFileSaved(){
if(stateBar.getText().equals("未被修改"))
return false;
else
return true;
}
private void open(){
//显示文件的对话框
int option= fileChooser.showDialog(null, null);
//使用者按下用键
if(option==JFileChooser.APPROVE_OPTION){
try{
//选取文件
BufferedReader buf = new BufferedReader(new FileReader(
fileChooser.getSelectedFile()));
//设定文件标题
setTitle(fileChooser.getSelectedFile().toString());
//清楚前一次
setTitle("");
//设定状态栏
stateBar.setText("未被修改");
//取得系统后果相应的换行字符
String lineSeparator = System.getProperty("line.separator");
//读取文件并附加到工作区
String text;
while((text=buf.readLine())!=null){
textArea.append(text);
textArea.append(lineSeparator);
}
buf.close();
}catch(IOException e){
JOptionPane.showMessageDialog(null, e.toString(),
"开启文件失败",JOptionPane.ERROR_MESSAGE);
}
}
}
private void saveFile() throws IOException{
//从标题栏中取得文件名称
File file = new File(getTitle());
if(file.exists()){ //若指定文件不存在,则执行另存为
saveFileAs();
}else{
BufferedWriter buf = new BufferedWriter(new FileWriter(file));
//将工作 区的文字保存在文件
buf.write(textArea.getText());
buf.close();
stateBar.setText("未被修改");
}
}
private void saveFileAs(){
//显示文件对话框
int option = JOptionPane.showConfirmDialog(null, null);
//如果确认选取文件
if(option==JFileChooser.APPROVE_OPTION){
File file = fileChooser.getSelectedFile();
//在标题栏上设置文件名称
setTitle(file.toString());
try{
file.createNewFile();
saveFile();
}catch(IOException e){
JOptionPane.showConfirmDialog(null, e.toString(),
"无法建立文件",JOptionPane.ERROR_MESSAGE);
}
}
}
private void closeFile() throws IOException{
//是否保存文件
if(isCurrentFileSaved())
dispose(); //释放资源,关闭后台
else{
int option = JOptionPane.showConfirmDialog(null, "文件已修改,是否保存",
"保存文件",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE,null);
switch(option){
case JOptionPane.YES_OPTION:
saveFile();
break;
case JOptionPane.NO_OPTION:
dispose();
break;
}
}
}
private void cut(){
textArea.cut();
stateBar.setText("已修改");
popupMenu.setVisible(false);
}
private void copy(){
textArea.copy();
popupMenu.setVisible(false);
}
private void paste(){
textArea.paste();
stateBar.setText("已修改");
popupMenu.setVisible(false);
}
初始化结构函数
public NoteUI(){
super("新建文本文件"); //继承父类构造函数,窗口名字为新建文本
initUI();
setUpEventListener();
setVisible(true);
}
在main函数中,创建一个实例
new NoteUI();
用myeclipse给软件打包,步骤如下:
单击[file],选择下拉菜单中的[export];
在select中,选择到处类型,我的选择是java类型下的Runnabel jar file;
next,选择打包文件和输出位置,然后就一切ok了。