`
xyheqhd888
  • 浏览: 409279 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
社区版块
存档分类
最新评论

专题制作--文字编辑器(文字编辑与保存)

阅读更多

1.  文字编辑与保存:

     (1). 打开文件的处理流程:

     首先定义出当使用者选取菜单上的“打开”命令时,所需的处理流程:检查目前编辑中的文件是否已保存,若是,则希望出现对话框供使用者选取所需的文件、打开它然后显示在文字编辑敬;否则出现对话框显示“文件已修改是否保存?”的消息,若单击“是”按钮则保存文件,单击“否”按钮放弃当前文件直接打开。

     上面的这几个流程可以分为几个子流程,例如检查文件是否保存、打开文件、保存文件,这几个子流程可以先定义为方法,待会再来实现。因而可以先实现以下的程序内容:

    

private void openFile()
{
    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 void opek(){}

 

private boolean isCurrentFileSaved()
{
     return false;
}

 在判断文件是否保存的方法上,主要是根据状态栏来进行判断。实现出的内容如下:

private boolean isCurrentFileSaved()
{
   if(stateBar.getText().equals("未修改"))
     return false;
   else
     return true;
}

打开文件是使用javax.swing.JFileChooser来显示文件选取的对话框,参见以下程序片段及注释:

private void open()
{
   //fileChooser是JFileChooser的实例
   //显示文件选取的对话框
   int option = fileChooser.showDialog(null,null);

   //使用者单击"确认"按钮
   if(option == JFileChooser.APPROVE_OPTION)
	{
	   try
	   {
		//打开选取的文件
		BufferedReader buf = 
			new BufferedReader(
			  new FileReader(fileChooser.getSelectedFile()));

		//设定文件标题
		setTitle(fileChooser.getSelectedFile().toString());
		//删除前一次文件
		textArea.setText("");
		//设定状态栏
		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);
	   }
	}
}

(2)保存文件的流程处理:

      在菜单上有“保存”及“另存为”两个选项,但事实上另存为只是多了个显示文件选择框的动作,在设定好文件之后,所使用的仍是保存的流程。

      在执行另存为时,显示文件选择对话框,让使用者输入文件名称,在确认后将文字编辑区的内容保存至指定的文件中。而在单击“保存”按钮时,如果标题栏上有指定文件的路径,则直接依该路径保存文件,否则执行“另存为”的流程。

      程序实现的片段如下所示:

private void saveFile()
{
   //从标题栏取得文件名称
  File file = new File(getTitle());

   //若指定的文件不存在
  if(!file.exists())
   {
        //执行另存为
     saveFileAs();
   }
   else
   {
        try
         {
              //打开指定的文件
         BufferedWriter buf =
               new BufferedWriter(new FileWriter(file));
              //将文件编辑区的文字写入文件
         buf.write(textArea.getText());
             buf.close();  
             //设置状态栏为未修改
         stateBar.setText("未修改");
         }
         catch(IOException e)
         {
             JOptionPane.showMessageDialog(null,e.toString(),"写入文件失败",JOptionPane.ERROR_MESSAGE); 
         }
   }
}

 

private void saveFileAs()
{
	//显示文件对话框
	int option = fileChooser.showDialog(null,null);

	//如果确认选取文件
	if(option == JFileChooser.APPROVE_OPTION)
	{
		//取得选择的文件
		File file = fileChooser.getSelectedFile();

		//在标题栏上设定文件名称
		setTitle(file.toString());

		try
		{
			//建立文件
			file.createNewFile();
			//进行文件保存
			saveFile();
		}
		catch (IOException e)
		{
			JOptionPane.showMessage(null,e.toString(),"无法建立新文件",JOptionPane.ERROR_MESSAGE);
		}
	}
}

 (3) 关闭文件的流程处理:

   关闭文件之前,主要必须检查文字编辑区的内容变动是否已保存。如果没有保存,则出现对话框提示使用者确认是否保存,若确认保存则进行保存或另存为的动作,否则直接关闭文件。程序的实现如下所示:

private void closeFile()
{
	//是否已保存文件
	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();
		}
	}
}

  (4) 文字区的编辑、剪切、复制和粘贴

   在文字编辑区进行剪切、复制、粘贴的动作,可以直接调用JTextArea的cut()、copy()、paste()方法,还特别处理了快捷菜单以及状态栏的问题。如下:

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);
}

private void processTextArea()
{
	stateBar.setText("已修改");
}

 至此,整个文字编辑器大致上都已经完成。完整的程序代码如下:

package ysu.hxy;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.BorderFactory;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;

public class JNotePadUI extends JFrame {
    private JMenuItem menuOpen;
    private JMenuItem menuSave;
    private JMenuItem menuSaveAs;
    private JMenuItem menuClose;

    private JMenu editMenu;
    private JMenuItem menuCut;
    private JMenuItem menuCopy;
    private JMenuItem menuPaste;

    private JMenuItem menuAbout;
    
    private JTextArea textArea;
    private JLabel stateBar;
    private JFileChooser fileChooser;
    
    private JPopupMenu popUpMenu;

    public JNotePadUI() {
        super("新建文本文件");
        setUpUIComponent();
        setUpEventListener();
        setVisible(true);
    }
    
    private void setUpUIComponent() {
        setSize(640, 480);
        
        // 菜单栏
        JMenuBar menuBar = new JMenuBar();
        
        // 设置「文件」菜单
        JMenu fileMenu = new JMenu("文件");
        menuOpen = new JMenuItem("打开");
        // 快捷键设置
        menuOpen.setAccelerator(
                    KeyStroke.getKeyStroke(
                            KeyEvent.VK_O, 
                            InputEvent.CTRL_MASK));
        menuSave = new JMenuItem("保存");
        menuSave.setAccelerator(
                    KeyStroke.getKeyStroke(
                            KeyEvent.VK_S, 
                            InputEvent.CTRL_MASK));
        menuSaveAs = new JMenuItem("另存为");

        menuClose = new JMenuItem("关闭");
        menuClose.setAccelerator(
                    KeyStroke.getKeyStroke(
                            KeyEvent.VK_Q, 
                            InputEvent.CTRL_MASK));
        
        fileMenu.add(menuOpen);
        fileMenu.addSeparator(); // 分隔线
        fileMenu.add(menuSave);
        fileMenu.add(menuSaveAs);        
        fileMenu.addSeparator(); // 分隔线
        fileMenu.add(menuClose);
        
        // 设置「编辑」菜单        
        JMenu editMenu = new JMenu("编辑");
        menuCut = new JMenuItem("剪切");
        menuCut.setAccelerator(
                    KeyStroke.getKeyStroke(KeyEvent.VK_X, 
                            InputEvent.CTRL_MASK));
        menuCopy = new JMenuItem("复制");
        menuCopy.setAccelerator(
                    KeyStroke.getKeyStroke(KeyEvent.VK_C, 
                            InputEvent.CTRL_MASK));
        menuPaste = new JMenuItem("粘贴");
        menuPaste.setAccelerator(
                    KeyStroke.getKeyStroke(KeyEvent.VK_V, 
                            InputEvent.CTRL_MASK));
        editMenu.add(menuCut);
        editMenu.add(menuCopy);
        editMenu.add(menuPaste);
        
        // 设置「关于」菜单        
        JMenu aboutMenu = new JMenu("关于");
        menuAbout = new JMenuItem("关于JNotePad");
        aboutMenu.add(menuAbout);
        
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(aboutMenu);

        
        setJMenuBar(menuBar);
        
        // 文字编辑区域
        textArea = new JTextArea();
        textArea.setFont(new Font("宋体", Font.PLAIN, 16));
        textArea.setLineWrap(true);
        JScrollPane panel = new JScrollPane(textArea,
          ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
          ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        
        Container contentPane = getContentPane();
        contentPane.add(panel, BorderLayout.CENTER);  
        
        // 状态栏
        stateBar = new JLabel("未修改");
        stateBar.setHorizontalAlignment(SwingConstants.LEFT); 
        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) { 
                    closeFile();
                }
            }
        );
        
        // 菜单 - 打开
        menuOpen.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    openFile();
                }
            }
        );

        // 菜单 - 保存
        menuSave.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    saveFile();
                }
            }
        );

        // 菜单 - 另存为
        menuSaveAs.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    saveFileAs();
                }
            }
        );


        // 菜单 - 关闭文件
        menuClose.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    closeFile();
                }
            }
        );

        // 菜单 - 剪切
        menuCut.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    cut();
                }
            }
        );

        // 菜单 - 复制
        menuCopy.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    copy();
                }
            }
        );

        // 菜单 - 粘贴
        menuPaste.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    paste();
                }
            }
        );
        
        // 菜单 - 关于
        menuAbout.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    // 显示对话框
                    JOptionPane.showOptionDialog(null, 
                        "程序名称:\n    JNotePad \n" + 
                        "程序设计:\n    良葛格\n" + 
                        "简介:\n    一个简单的文字编辑器\n" + 
                        "    可作为验收Java的实现对象\n" +
                        "    欢迎网友下载研究交流\n\n" +
                        "http://caterpillar.onlyfun.net/",
                        "关于JNotePad",
                        JOptionPane.DEFAULT_OPTION,
                        JOptionPane.INFORMATION_MESSAGE,
                        null, null, null);
                }
            }
        );      
        
        // 编辑区键盘事件
        textArea.addKeyListener(
            new KeyAdapter() {
                public void keyTyped(KeyEvent e) {
                    processTextArea();
                }
            }
        );

        // 编辑区鼠标事件
        textArea.addMouseListener(
            new MouseAdapter() {
                public void mouseReleased(MouseEvent e) {
                    if(e.getButton() == MouseEvent.BUTTON3)
                        popUpMenu.show(editMenu, e.getX(), e.getY());
                }
                
                public void mouseClicked(MouseEvent e) {
                    if(e.getButton() == MouseEvent.BUTTON1)
                        popUpMenu.setVisible(false);
                }
            }
        );        
    }

    private void openFile() {
        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() {
        // fileChooser 是 JFileChooser 的实例
        // 显示文件选取的对话框
        int option = fileChooser.showDialog(null, null);
            
        // 使用者按下确认键
        if(option == JFileChooser.APPROVE_OPTION) {
            try {
                // 开启选取的文件
                BufferedReader buf = 
                    new BufferedReader(
                       new FileReader(
                         fileChooser.getSelectedFile()));

                // 设定文件标题
                setTitle(fileChooser.getSelectedFile().toString());
                // 清除前一次文件
                textArea.setText("");
                // 设定状态栏
                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() {
        // 从标题栏取得文件名称
        File file = new File(getTitle());

        // 若指定的文件不存在
        if(!file.exists()) {
            // 执行另存为
            saveFileAs();
        }
        else {
            try {
                // 开启指定的文件
                BufferedWriter buf = 
                    new BufferedWriter(
                            new FileWriter(file));
                // 将文字编辑区的文字写入文件
                buf.write(textArea.getText());
                buf.close();
                // 设定状态栏为未修改
                stateBar.setText("未修改");
            }
            catch(IOException e) {
                JOptionPane.showMessageDialog(null, e.toString(),
                  "写入文件失败", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    private void saveFileAs() {
        // 显示文件对话框
        int option = fileChooser.showSaveDialog(null);

        // 如果确认选取文件
        if(option == JFileChooser.APPROVE_OPTION) {
            // 取得选择的文件
            File file = fileChooser.getSelectedFile();
            
            // 在标题栏上设定文件名称
            setTitle(file.toString());
                
            try {
                // 建立文件
                file.createNewFile();
                // 进行文件保存
                    saveFile();
            }
            catch(IOException e) {
            JOptionPane.showMessageDialog(null, e.toString(),
                   "无法建立新文件", JOptionPane.ERROR_MESSAGE);
            }
        }   
    }

    private void closeFile() {
        // 是否已保存文件
        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();
            }
        }
    }

    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);
    }

    private void processTextArea() {
            stateBar.setText("已修改");
    }


    
    public static void main(String[] args) {
        new JNotePadUI();
    }    
   }

  

分享到:
评论

相关推荐

    专题资料(2021-2022年)WaStar网站管理系统服务商操作手册.doc

    【在线网页编辑器使用详解】 在线网页编辑器是一种强大的工具,允许用户通过浏览器直接编辑网页内容,无需深入了解HTML代码。这种“所见即所得”的编辑方式使得网页的图文混排变得简单直观。在WaStar网站管理系统中...

    专题资料(2021-2022年)《计算机应用基础》实训指导书.doc

    - 基本操作:掌握创建、编辑和保存文档的流程,包括字体样式调整、段落格式设置、页面布局设计等。 - 实际应用:练习制作电子板报、毕业论文和公司传真,涉及图文混排、页眉页脚设置、页边距调整等内容。 3. **...

    精品专题(2021-2022年收藏)Office办公软件学习资料零基础分析.doc

    此外,Word的公式编辑器对于科研人员或工程技术人员来说,也是一个非常实用的工具。在格式化文档时,菜单栏和工具栏提供了快速有效的途径,让用户可以轻松进行页面设置、保存文档以及其他编辑操作。 Excel的出现则...

    专题资料(2021-2022年)aegisub的基本操作解析.doc

    《Aegisub基础操作解析》 ...综上所述,Aegisub提供了全面的字幕编辑功能,无论是基本的文字样式调整,还是复杂的时间轴制作,都能得心应手。熟练掌握这些基本操作,将助你在字幕制作领域游刃有余。

    计算机一级操作题专题.pdf

    ### 计算机一级操作题专题知识点解析 #### 一、文件操作(15分) 1. **创建文件夹** - 在指定路径下创建一个新的文件夹`T□`,其中`□`代表考生自己的准考证号。 - 创建新文件夹的操作是计算机基础中最常见的...

    Word、Excel、PPT使用技巧与实战方法大全(2010完整版

    选中需要隐藏的文字,然后设置其颜色与背景相同即可。 52. **用F4键重复输入字符和图形** 输入字符或绘制图形后,按F4键可以重复最后一次操作。 53. **在Word中精确移动对象** 按住`Shift`键的同时使用方向键...

    甘肃省地下水GIS培训资料.pdf

    - **操作**: 在符号选择器中选择适合图层特征的符号样式。 - **1.2.2 用单一值绘制图层** - **操作**: 通过属性设置,根据图层中某一属性值的不同采用不同的符号表示。 - **1.2.3 地图标注** - **操作**: 使用...

    ArcMap实用教程

    - **打印与导出**:将地图保存为图像或PDF,用于报告和展示。 - **Web地图发布**:通过ArcGIS Server将地图服务发布到Web,实现在线共享和互动浏览。 8. **协同工作与版本管理** - **Geodatabase版本**:支持多...

    信息技术培训记录[1].pdf

    【信息技术培训记录】的文档包含了多个关于信息技术教育和应用的专题,主要涵盖了课件制作、资源准备、网络基础、网络安全以及Windows操作系统的基本操作。以下是这些专题的详细解析: 1. **课件制作**: - **完整...

    行业文档-设计装置-报纸.zip

    文件"报纸.pdf"是这个压缩包的主要内容,我们可以推测这是一份详细探讨报纸设计与制作的文档。PDF格式通常用于保存具有专业排版和图形设计的内容,以便于阅读和打印。这份文档可能包含了以下关键知识点: 1. **报纸...

    基于j2ee的cms开题报告

    - **媒体行业**:新闻报道、专题制作、互动社区等。 #### 六、结语 基于J2EE的CMS系统设计与实现,不仅解决了传统网站的局限性,还为企业和个人提供了高效、便捷的内容管理解决方案。通过运用先进的技术框架和设计...

    QGIS无线场景应用操作指导书.docx

    QGIS是一款开源地理信息系统,广泛应用于地图制作、地理数据分析和无线网络规划等领域。以下将对文档中的主要知识点进行详细解释。 ### 1. 概述 在无线场景应用中,QGIS提供了强大的工具集来处理与无线通信相关的...

    2012计算机应用基础答案(西南交通大学第2版)..doc

    Microsoft Word作为文字处理软件,其文本编辑、格式化、页眉页脚设置、视图模式等具体操作,是日常工作中不可避免的技能。了解如何进行表格操作,以及文档的打印和排版技巧,可以大大提高我们的工作效率和文档质量。...

    CMS 网站管理系统 源码

    16、强化在线编辑器(采用ewebeditor在线编辑器),可视化编辑器,类似word的所件即所得的在线内容编辑功能,支持表格、图片、FLASH、多种格式播放器插入,支持图片和附件上传。 17、字符过滤,自动过滤敏感字符,...

    信息化教学资源的收集与处理.pptx

    对于文本资源,可以通过键盘输入、扫描印刷品、网络电子资源,甚至利用OCR技术将图像文字转化为可编辑文本。图像资源则可以通过素材光盘、教学资源库、网络查找、扫描、抓图或使用图像处理软件创作。音频资源可以从...

    牛叉内容管理系统(NiuXcms) v1.07.rar

    7. 编辑器 自动排版 可自动保存个人偏好。 8. 添加/修改文章界面增加“关键词搜索相关文章列表”插入文章功能。 9. 增加通用文章专题样板模板。配合文章内容专题模板,轻松制作专题。   【1.04版升级日志】 1....

    医院宣教科工作制度职责..doc

    四、了解并掌握医院各科室的需求和建议,及时捕捉新闻素材,通过摄影、录像和文字编辑,把握宣传的时效性,确保信息的准确性和及时性。 五、宣教科负责制作和管理院内的横幅、会标、标识、标牌、展板等,所有制作需...

    买车网整站源码 v12.rar

    13、可视化编辑器,类似word的所件即所得的在线内容编辑功能,支持表格、图片、FLASH、多种格式播放器插入,支持图片和附件上传。   14、字符过滤,自动过滤敏感字符,避免损害网站形象、避免网站被公安机关强制...

    Art2008 CMS 网站管理系统 v3.1.rar

    16、强化在线编辑器(采用ewebeditor在线编辑器),可视化编辑器,类似word的所件即所得的在线内容编辑功能,支持表格、图片、FLASH、多种格式播放器插入,支持图片和附件上传。 17、字符过滤,自动过滤敏感字符,...

    DJCMS影视程序 v3.0.2011.05.6.rar

    系统内置的编辑器,使得添加数据介绍更加得心应手为广大站长助力。资源管理系统可以方便的添加,删除数据,设置推荐,设置专题,支持批量操作,支持无限极数据分类!后台添加修改数据集成web采集助手,支持youku、...

Global site tag (gtag.js) - Google Analytics