- 浏览: 409301 次
- 性别:
- 来自: 秦皇岛
最新评论
-
prayjourney:
了解了,讲的不错
DataInputStream和DataOutputStream类 -
niunianss:
将字节退回的时候,需要添加判断,最后一个字符是英文时,实际数组 ...
PushbackInputStream -
cctt_1:
不要误人子弟,那根本就不是 解释器模式!!!那是Composi ...
Interpreter(解释器)模式 -
java-大神:
[i][i]引用引用引用引用[/img][/img][/img ...
BufferedReader和BufferedWriter -
百合不是茶:
你的程序在文件输入输出流中传入agrs[0]时,会报错越界 ...
DataInputStream和DataOutputStream类
1. 事件处理:
在Java中事件以具体的对象来表示,使用者的相关动作会由JVM建立相对应的事件,用以描述事件来源、发生了什么事情以及相关的消息,需要通过捕捉对应的事件,以进行对应的操作来完成应用程序的功能。
2. Java事件模型:
Java对事件的处理采用委托事件模型(Delegation Event Model),在这个模型下,事件被送到对应的组件,而组件会将事件传播至每个事件监听器(Event Listener),事件监听器中定义了与不同事件相对应的事件处理者(Event Handler),只有向组件注册的事件监听器才能收到事件。通过这种模型,事件发生时是委托事件处理者进行处理,事件处理者与组件的设计可以分别独立。
具体来说,事件监听器实现了java.util.EventListener接口,不过这个接口只是个标示接口(Marker Interface)。其中并没有规定必须实现的方法。对于J2SE窗口程序而言,相对应的事件监听器主要位于java.awt.event与javax.swing.event包之下,它们都是EventListener的子接口。
3. 文字编辑器的事件处理:
以菜单项被单击时的事件处理来说,要实现java.awt.event.ActionListener接口。例如:
//打开"文件"菜单项的事件处理 menuOpen.addActionListener { new ActionListener() { public void actionPerformed(ActionEvent e) { openFile(); } } }
这时采取的是匿名类的方式实现了ActionListener接口,该接口定义了actionPerformed()方法,这个方法就是事件处理者。 您要在当中实现菜单项被单击时所要进行的处理。当菜单项被单击时会发出ActionEvent。这个事件会传递给曾向菜单项组件注册的事件监听器,并调用对应的事件处理者。向菜单项组件注册事件监听器的方式是使用addActionListener()方法。
以上示范的是JMenuItem的事件处理,至于JTextArea的事件方面,由于需求中主要是针对编辑文字时的事件作处理,编辑文字主要是键盘操作,因而会发生KeyEvent事件。可以实现java.awt.event.KeyListener接口来设置相关的事件处理,这个接口有3个方法(事件处理者)必须实现:
package ysu.hxy; public interface KeyListener { public void keyPressed(KeyEvent e) public void keyReleased(KeyEvent e) public void keyTyped(KeyEvent e) }
对于这个将要制作的文字编辑器而言,您所感兴趣的主要是键盘被按下进行文字编辑时的事件处理,所以可以仅实现keyTyped()方法,另两个方法在实现时保持空白即可,也可以继承java.awt.event.KeyAdapter。KeyAdapter类实现KeyListener接口,而对3个方法实现时仅保持空白,通过继承KeyAdapter,可以用仅重新定义keyTyped()方法,而不用对另两个方法也进行实现,编写时较为方便且程序代码看来也会比较简洁。可以使用JTextArea的addKeyListener()方法加入事件监听器,例如:
//编辑区键盘事件 textArea.addKeyListener( new KeyAdapter() { public void keyTyped(KeyEvent e) { processTextArea(); } } );
文字编辑区也会有鼠标事件,也就是使用鼠标按右键显示快捷菜单,以执行剪切、复制、粘贴的动作来进行文字编辑。鼠标事件监听器是实现java.awt.event.MouseListener接口,其中有5个方法必须实现,如果觉得麻烦,可以继承java.awt.event.MouseAdapter,它实现了MouseListener接口,但实现方法时保持空白,也可以在继承MouseAdapter后,对感兴趣的事件处理者进行实现。例如:
//编辑区鼠标事件 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); } } }
鼠标处理者接受的是MouseEvent,您可以使用getButton()方法取得一个常数,表示按下的是那个鼠标键,MouseEvent.Button1是指按下鼠标左键,MouseEvent.Button3表示按下鼠标右键,您使用JTextArea的addMouseListener()方法加入监听器。程序片段中的popUpMenu参考至javax.swing.JPopupMenu的实例,这个实例可用编辑菜单直接取得。例如:
JPopupMenu popUpMenu = editMenu.getPopupMenu();
还有一个事件是您要处理的,就是单击窗口右上角的X按钮时,希望动作与单击菜单中“关闭”具有相同的行为,所以删去原来程序中的这行:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
并且改为自行实现java.awt.event.WindowListener。这个接口中有7个方法必须实现,如果觉得麻烦,可以继承实现了此接口的java.awt.event.WindowAdapter。然后对感兴趣的方法进行实现。例如:
//单击窗口关闭按钮事件处理 addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { closeFile(); } } );
要向JFrame注册WindowListener,可以使用addWindowListener()方法。windowClosing()方法会在单击X按钮后,窗口真正关闭前执行。 以下是将以上说明实际套用至文字编辑器实现中的程序代码:
package ysu.hxy; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; //import java.awt.event.InputEvent; //import java.awt.event.KeyEvent; import java.awt.event.*; 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 javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; import javax.swing.KeyStroke; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; import javax.swing.JPopupMenu; import javax.swing. JOptionPane; 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 menuPaste; private JMenuItem menuCopy; private JMenuItem menuAbout; private JTextArea textArea; 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("粘贴"); menuCopy.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); //状态栏 JLabel stateBar = new JLabel("未修改"); stateBar.setHorizontalAlignment(SwingConstants.LEFT); stateBar.setBorder(BorderFactory.createEtchedBorder()); contentPane.add(stateBar,BorderLayout.SOUTH); popUpMenu = editMenu.getPopupMenu(); } 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(){} private void saveFile(){} private void saveFileAs(){} private void closeFile(){} private void cut(){} private void copy(){} private void paste(){} private void processTextArea(){} 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 15542. 重新思考图像代理: 现在需要思考设计模式是否 ... -
Junit简介
2009-04-08 17:46 16501. 单元测试(Unit Test) 一个单元(Un ... -
Ant简介
2009-04-08 13:10 18541. Ant可以自动完成的任务: (1)编译Java源代 ... -
专题制作--文字编辑器(文字编辑与保存)
2009-04-08 10:43 22161. 文字编辑与保存: (1). 打开文件的处理流 ... -
专题制作--文字编辑器(接口部分)
2009-04-07 20:28 21501. Swing入门: 若要使用J2SE来开发窗口应用 ... -
信息绑定(国际化处理)
2009-04-07 20:02 15851. 程序中的一些文字信息可以将之定义在一个属性文件中,而不定 ... -
日志(Logging)
2009-04-07 16:14 17311. 日志(Logging) 程序不免会出现错误,当 ... -
Java中的日期和时间
2009-04-07 11:26 19591. 使用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 17571. 修改成员值: 尽管直接存取类的域成员是不被鼓励的 ... -
使用反射生成与操作对象(一)
2009-04-06 15:16 21101. 使用反射机制,可以在运行时期动态加载类并生成对象,操作对 ... -
Java中的反射(二)
2009-04-06 10:42 20781. 当在命令行模式下执行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中的每个线程都 ...
相关推荐
关键是破解的版本,唯一网上可以保存制作后的简谱文件的音乐软件。JP-Word是一款简谱编辑软件,它的特点是体积小巧,输入便捷,所见即所得,音符的排版格式极为灵活,文本与乐谱可以混合排版,乐谱的字体可以有多种...
FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器。它志于轻量化,不需要太复杂的安装步骤即可使用。它可和PHP、JavaScript、ASP、ASP.NET、ColdFusion、Java、以及 ABAP等不同的编程语言相...
4. 脚本编辑器:编写和调试 Lua 或 JavaScript 代码,实现游戏逻辑。 在《使用cocos2d-x开发各种编辑器》的文章中,可能涵盖了以下关键知识点: 1. UI组件与交互:使用cocos2d-x的UI库(如ccui)创建按钮、文本框、...
在本资源中,"ArcGIS专题图制作-人口空间分布专题图(详细技术文档与录屏)"提供了全面的学习材料,旨在帮助初学者掌握如何利用ArcGIS软件进行人口空间分布的专题图绘制。ArcGIS是一款强大的地理信息系统(GIS),...
本话题聚焦于易语言中的一个特定功能:超级编辑框组件,以及如何在其中实现依附操作,即粘贴图片和文字。 超级编辑框是易语言提供的一种强大的文本编辑组件,它支持多种高级特性,如多行文本编辑、查找替换、字体...
【富文本编辑器:结合文字与图片的编辑工具】 富文本编辑器是一种允许用户在文本中插入、编辑和格式化文字以及图片的交互式编辑工具。在移动应用开发,特别是Android平台,这样的编辑器功能非常实用,因为它为用户...
DW模板编辑器选件作为这个系统的一部分,主要服务于TRS-wcm的模板设计环节。 在使用DW模板编辑器选件时,用户可以利用其丰富的编辑功能,轻松创建符合业务需求的HTML模板。这些模板可以预先设定好布局、样式和动态...
这个文本编辑器能实现基本的文字输入、编辑、保存等功能,对于初学者来说,是一个很好的实践项目。 首先,我们需要了解C#的基础知识,包括类、对象、事件、控件以及文件I/O操作。C#中的WinForms或WPF框架提供了丰富...
JavaScript可以轻松实现文字的淡入淡出、滑动、闪烁等动画效果。通过修改元素的CSS属性,如`opacity`(透明度)和`transform`(变换),我们可以控制文字的显示和隐藏,或者使其在页面上移动。 2. 文字滚动: ...
Eclipse 实现 Java 编辑器【一】(制作GUI界面)- 代码 Eclipse 实现 Java 编辑器【一】(制作GUI界面)- 代码 Eclipse 实现 Java 编辑器【一】(制作GUI界面)- 代码
Web编辑器通常被称为富文本编辑器,允许用户在网页上直接进行文字编辑、格式化、图片插入等操作,类似于我们在桌面环境下使用的Word或记事本。它们主要由前端界面和后端服务两部分组成,前端负责用户交互和数据处理...
它的功能比 Windows 中的 Notepad(记事本)强大,除了可以用来制作一般的纯文字说明文件,也十分适合当作编写电脑程序的编辑器。Notepad++ 不仅有语法高亮度显示,也有语法折叠功能,并且支持宏以及扩充基本功能的...
2. 元数据编辑:除了图像本身,编辑器还允许用户修改与图像相关的数据,如位置信息、动画帧数、透明度设置等,这对于游戏逻辑的调整至关重要。 3. 文件导出与导入:用户可以将编辑后的图像导出为标准格式(如.png或...
H5端的富文本编辑器虽然常见,但在原生Android应用中,用户往往需要自行构建复杂的控件组合来实现类似功能。然而,有了`richeditor-android`,这一切变得简单而高效。这个开源框架专为Android平台设计,旨在提供与H5...
3. **编辑器实现方式**: - 基于iframe的实现:将编辑区域放在一个独立的文档环境中,避免污染主页面样式。 - 使用contentEditable属性:直接将某个元素设置为可编辑,现代浏览器广泛支持。 4. **开源富文本编辑...
【Qt实现的一个文本编辑器】 Qt是一个跨平台的C++应用程序开发框架,广泛用于创建图形用户界面和其他软件。它由The Qt Company维护,并且在开源社区中非常活跃。本项目利用Qt库实现了一个简单的文本编辑器,具备...
总的来说,这个“wordPADDemo”项目是一个简单的C# WinForm文字编辑器,它展示了如何利用.NET Framework提供的工具实现基本的文字编辑功能。通过学习和扩展这个示例,你可以更好地掌握C#编程、WinForm UI设计以及与...
在图片编辑器的实现中,最核心的部分可能是图像处理功能。Delphi提供了GDI+和VCL图像处理组件,可以进行基本的图像加载、显示、旋转、裁剪、滤镜应用等操作。例如,`TImage`组件用于显示图像,`TBitmap`对象则可以...
DLL文件编辑器是一种专业工具,允许用户查看和修改这些文件的内容,以实现特定的目的,例如修复错误、优化性能或自定义软件行为。以下是对DLL编辑器及相关知识的详细解释: 1. **DLL文件的作用**: - 共享代码:...
- **实验项目**:文本编辑器的实现 - **指导教师**:李莉丽 - **学生姓名**:陈德怀 - **学生学号**:2009053035 - **班级**:数媒一班 - **实验地点**:未指定 - **实验时间**:2010年月日点~点 - **实验成绩**:待...