- 浏览: 409279 次
- 性别:
- 来自: 秦皇岛
最新评论
-
prayjourney:
了解了,讲的不错
DataInputStream和DataOutputStream类 -
niunianss:
将字节退回的时候,需要添加判断,最后一个字符是英文时,实际数组 ...
PushbackInputStream -
cctt_1:
不要误人子弟,那根本就不是 解释器模式!!!那是Composi ...
Interpreter(解释器)模式 -
java-大神:
[i][i]引用引用引用引用[/img][/img][/img ...
BufferedReader和BufferedWriter -
百合不是茶:
你的程序在文件输入输出流中传入agrs[0]时,会报错越界 ...
DataInputStream和DataOutputStream类
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(); } }
发表评论
-
内部类总结
2009-11-27 14:28 1222一、方法及作用域内的内部类:1.在一个方法内定义的类2.在一个 ... -
finalize()方法终结条件验证 示例代码
2009-09-20 09:23 1348package Initialization; clas ... -
Proxy(代理)模式二
2009-05-15 21:16 15532. 重新思考图像代理: 现在需要思考设计模式是否 ... -
Junit简介
2009-04-08 17:46 16501. 单元测试(Unit Test) 一个单元(Un ... -
Ant简介
2009-04-08 13:10 18531. Ant可以自动完成的任务: (1)编译Java源代 ... -
专题制作--文字编辑器(逻辑实现部分)
2009-04-07 22:35 19061. 事件处理: 在Java中事件以具体的对象来表 ... -
专题制作--文字编辑器(接口部分)
2009-04-07 20:28 21491. Swing入门: 若要使用J2SE来开发窗口应用 ... -
信息绑定(国际化处理)
2009-04-07 20:02 15851. 程序中的一些文字信息可以将之定义在一个属性文件中,而不定 ... -
日志(Logging)
2009-04-07 16:14 17281. 日志(Logging) 程序不免会出现错误,当 ... -
Java中的日期和时间
2009-04-07 11:26 19581. 使用Date: 使用System.cu ... -
meta-annotation
2009-04-07 09:23 30831. 所谓meta-annotation就是Annotati ... -
Annotion
2009-04-06 23:05 16841. Annotation对程序运行没有影响,它的目的在于对编 ... -
使用反射生成与操作对象(二)
2009-04-06 17:04 17561. 修改成员值: 尽管直接存取类的域成员是不被鼓励的 ... -
使用反射生成与操作对象(一)
2009-04-06 15:16 21101. 使用反射机制,可以在运行时期动态加载类并生成对象,操作对 ... -
Java中的反射(二)
2009-04-06 10:42 20771. 当在命令行模式下执行java XXX.class 指令后 ... -
Java中的反射(一)
2009-04-06 09:43 13931. Java提供的反射机制允许您在运行时动态加载类、查看类信 ... -
容器类的线程安全及ThreadLocal类
2009-04-05 21:28 30571. 容器类默认没有考虑 ... -
wait()和notify()
2009-04-05 19:06 13731. wait()、notify()、notifyAll() ... -
Java线程之同步化(Synchronized)主题
2009-04-05 16:44 27151. 如果一个对象所持有的数据可以被多线程同时共享存取,必须 ... -
Java线程(三)
2009-04-05 15:37 18931. Java中的每个线程都 ...
相关推荐
【在线网页编辑器使用详解】 在线网页编辑器是一种强大的工具,允许用户通过浏览器直接编辑网页内容,无需深入了解HTML代码。这种“所见即所得”的编辑方式使得网页的图文混排变得简单直观。在WaStar网站管理系统中...
- 基本操作:掌握创建、编辑和保存文档的流程,包括字体样式调整、段落格式设置、页面布局设计等。 - 实际应用:练习制作电子板报、毕业论文和公司传真,涉及图文混排、页眉页脚设置、页边距调整等内容。 3. **...
此外,Word的公式编辑器对于科研人员或工程技术人员来说,也是一个非常实用的工具。在格式化文档时,菜单栏和工具栏提供了快速有效的途径,让用户可以轻松进行页面设置、保存文档以及其他编辑操作。 Excel的出现则...
《Aegisub基础操作解析》 ...综上所述,Aegisub提供了全面的字幕编辑功能,无论是基本的文字样式调整,还是复杂的时间轴制作,都能得心应手。熟练掌握这些基本操作,将助你在字幕制作领域游刃有余。
### 计算机一级操作题专题知识点解析 #### 一、文件操作(15分) 1. **创建文件夹** - 在指定路径下创建一个新的文件夹`T□`,其中`□`代表考生自己的准考证号。 - 创建新文件夹的操作是计算机基础中最常见的...
选中需要隐藏的文字,然后设置其颜色与背景相同即可。 52. **用F4键重复输入字符和图形** 输入字符或绘制图形后,按F4键可以重复最后一次操作。 53. **在Word中精确移动对象** 按住`Shift`键的同时使用方向键...
- **操作**: 在符号选择器中选择适合图层特征的符号样式。 - **1.2.2 用单一值绘制图层** - **操作**: 通过属性设置,根据图层中某一属性值的不同采用不同的符号表示。 - **1.2.3 地图标注** - **操作**: 使用...
- **打印与导出**:将地图保存为图像或PDF,用于报告和展示。 - **Web地图发布**:通过ArcGIS Server将地图服务发布到Web,实现在线共享和互动浏览。 8. **协同工作与版本管理** - **Geodatabase版本**:支持多...
【信息技术培训记录】的文档包含了多个关于信息技术教育和应用的专题,主要涵盖了课件制作、资源准备、网络基础、网络安全以及Windows操作系统的基本操作。以下是这些专题的详细解析: 1. **课件制作**: - **完整...
文件"报纸.pdf"是这个压缩包的主要内容,我们可以推测这是一份详细探讨报纸设计与制作的文档。PDF格式通常用于保存具有专业排版和图形设计的内容,以便于阅读和打印。这份文档可能包含了以下关键知识点: 1. **报纸...
- **媒体行业**:新闻报道、专题制作、互动社区等。 #### 六、结语 基于J2EE的CMS系统设计与实现,不仅解决了传统网站的局限性,还为企业和个人提供了高效、便捷的内容管理解决方案。通过运用先进的技术框架和设计...
QGIS是一款开源地理信息系统,广泛应用于地图制作、地理数据分析和无线网络规划等领域。以下将对文档中的主要知识点进行详细解释。 ### 1. 概述 在无线场景应用中,QGIS提供了强大的工具集来处理与无线通信相关的...
Microsoft Word作为文字处理软件,其文本编辑、格式化、页眉页脚设置、视图模式等具体操作,是日常工作中不可避免的技能。了解如何进行表格操作,以及文档的打印和排版技巧,可以大大提高我们的工作效率和文档质量。...
16、强化在线编辑器(采用ewebeditor在线编辑器),可视化编辑器,类似word的所件即所得的在线内容编辑功能,支持表格、图片、FLASH、多种格式播放器插入,支持图片和附件上传。 17、字符过滤,自动过滤敏感字符,...
对于文本资源,可以通过键盘输入、扫描印刷品、网络电子资源,甚至利用OCR技术将图像文字转化为可编辑文本。图像资源则可以通过素材光盘、教学资源库、网络查找、扫描、抓图或使用图像处理软件创作。音频资源可以从...
7. 编辑器 自动排版 可自动保存个人偏好。 8. 添加/修改文章界面增加“关键词搜索相关文章列表”插入文章功能。 9. 增加通用文章专题样板模板。配合文章内容专题模板,轻松制作专题。 【1.04版升级日志】 1....
四、了解并掌握医院各科室的需求和建议,及时捕捉新闻素材,通过摄影、录像和文字编辑,把握宣传的时效性,确保信息的准确性和及时性。 五、宣教科负责制作和管理院内的横幅、会标、标识、标牌、展板等,所有制作需...
13、可视化编辑器,类似word的所件即所得的在线内容编辑功能,支持表格、图片、FLASH、多种格式播放器插入,支持图片和附件上传。 14、字符过滤,自动过滤敏感字符,避免损害网站形象、避免网站被公安机关强制...
16、强化在线编辑器(采用ewebeditor在线编辑器),可视化编辑器,类似word的所件即所得的在线内容编辑功能,支持表格、图片、FLASH、多种格式播放器插入,支持图片和附件上传。 17、字符过滤,自动过滤敏感字符,...
系统内置的编辑器,使得添加数据介绍更加得心应手为广大站长助力。资源管理系统可以方便的添加,删除数据,设置推荐,设置专题,支持批量操作,支持无限极数据分类!后台添加修改数据集成web采集助手,支持youku、...