- 浏览: 411006 次
- 性别:
- 来自: 秦皇岛
-
最新评论
-
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 1245一、方法及作用域内的内部类:1.在一个方法内定义的类2.在一个 ... -
finalize()方法终结条件验证 示例代码
2009-09-20 09:23 1373package Initialization; clas ... -
Proxy(代理)模式二
2009-05-15 21:16 15712. 重新思考图像代理: 现在需要思考设计模式是否 ... -
Junit简介
2009-04-08 17:46 16721. 单元测试(Unit Test) 一个单元(Un ... -
Ant简介
2009-04-08 13:10 18781. Ant可以自动完成的任务: (1)编译Java源代 ... -
专题制作--文字编辑器(文字编辑与保存)
2009-04-08 10:43 22471. 文字编辑与保存: (1). 打开文件的处理流 ... -
专题制作--文字编辑器(接口部分)
2009-04-07 20:28 21671. Swing入门: 若要使用J2SE来开发窗口应用 ... -
信息绑定(国际化处理)
2009-04-07 20:02 16071. 程序中的一些文字信息可以将之定义在一个属性文件中,而不定 ... -
日志(Logging)
2009-04-07 16:14 17621. 日志(Logging) 程序不免会出现错误,当 ... -
Java中的日期和时间
2009-04-07 11:26 19671. 使用Date: 使用System.cu ... -
meta-annotation
2009-04-07 09:23 30951. 所谓meta-annotation就是Annotati ... -
Annotion
2009-04-06 23:05 17031. Annotation对程序运行没有影响,它的目的在于对编 ... -
使用反射生成与操作对象(二)
2009-04-06 17:04 17651. 修改成员值: 尽管直接存取类的域成员是不被鼓励的 ... -
使用反射生成与操作对象(一)
2009-04-06 15:16 21351. 使用反射机制,可以在运行时期动态加载类并生成对象,操作对 ... -
Java中的反射(二)
2009-04-06 10:42 20961. 当在命令行模式下执行java XXX.class 指令后 ... -
Java中的反射(一)
2009-04-06 09:43 14111. Java提供的反射机制允许您在运行时动态加载类、查看类信 ... -
容器类的线程安全及ThreadLocal类
2009-04-05 21:28 30751. 容器类默认没有考虑 ... -
wait()和notify()
2009-04-05 19:06 13901. wait()、notify()、notifyAll() ... -
Java线程之同步化(Synchronized)主题
2009-04-05 16:44 27251. 如果一个对象所持有的数据可以被多线程同时共享存取,必须 ... -
Java线程(三)
2009-04-05 15:37 18961. Java中的每个线程都 ...
相关推荐
此外,Word的公式编辑器对于科研人员或工程技术人员来说,也是一个非常实用的工具。在格式化文档时,菜单栏和工具栏提供了快速有效的途径,让用户可以轻松进行页面设置、保存文档以及其他编辑操作。 Excel的出现则...
Microsoft Word作为文字处理软件,其文本编辑、格式化、页眉页脚设置、视图模式等具体操作,是日常工作中不可避免的技能。了解如何进行表格操作,以及文档的打印和排版技巧,可以大大提高我们的工作效率和文档质量。...
信息技术是现代社会不可或缺的部分,它涵盖了从简单的数据处理到复杂的人工智能应用。在这个领域,我们需要理解和掌握各种工具和技术。以下是一些从题目中提取的重要知识点: 1. 图像编辑工具:Photoshop是一款专业...
对于文本资源,可以通过键盘输入、扫描印刷品、网络电子资源,甚至利用OCR技术将图像文字转化为可编辑文本。图像资源则可以通过素材光盘、教学资源库、网络查找、扫描、抓图或使用图像处理软件创作。音频资源可以从...
11、内置最新eWebEditor 7.0编辑器,所见即所得。完全超值! 12、完全开放的接口,提供二次开发空间,并可方便接入第三方统计、在线客服等模块。 13、最佳安全性:以网站开发者角度出发,配以锐智企业建站系统产品...