一个程序最为核心的东西当然是对于事件的处理了,而事件的处理则是由事件机制来完成的。事件机制包括几个概念,一为事件源,二为事件监听方法,三为事件处理类。
事件源,很好理解,就是动作所发生的地方,既然要有动作发生,则必须是在图形界面上。比如说,手机游戏愤怒的小鸟,当你的手去碰触小鸟的时候,小鸟就是一个事件源。
事件监听方法,大致分为:1.动作监听器方法(addActionListener()),可捕获事件源(输入框)的回车和事件源(按钮)上的鼠标点击;2.鼠标监听器方法(addMouseListener(MouseListener l)),可捕获事件源上鼠标按下,释放,单击,进入和离开;3.鼠标移动监听器方法(addMouseMotionListener(MouseMotionListener l));可捕获事件源上鼠标按下拖动或者移动鼠标;4.键盘监听器方法(addKeyListener(KeyListener l)),可捕获事件源上是否有按键按下,松开。
最后就是事件处理类了,而说到事件处理类,就得说到接口了。接口,定义关键字为interface。接口可以继承多个接口,接口中只能定义常量和抽象(abstract)方法。抽象方法和方法的区别就在于抽象方法无方法内容,这也就意味着接口不能实例化(产生对象)。既然不能实例化,那么总得有其存在的道理,那就是接口的实现。接口的实现关键字是implements,通过别的类来实现(继承)接口。而且 一个类只能继承一个类,但能继承多个接口。而事件处理类则需要来继承事件监听接口。既然继承了接口,由于接口中有抽象方法,那么事件处理类就需要对抽象方法重写一个普通方法。
在运用事件机制的时候,需要注意的就是将不同的方法中需要监听的对象存放在一个事件处理类中,然后在事件处理类中进行处理。
下面是一个只能进行四则运算,相反数的简单计算器代码:
package windows_calculate; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JTextField; public class Calculate { //主程序入口 public static void main(String[] args) { Calculate ui=new Calculate(); ui.initUi(); } //定义一个初始化窗口方法 public void initUi(){ //实例化窗口 JFrame frame=new JFrame(); //设置窗口大小 frame.setSize(228,323); //设置窗口位置 frame.setLocationRelativeTo(null); //设置窗口不可改变大小 frame.setResizable(false); //设置整体布局为边框布局 BorderLayout border1=new BorderLayout(); frame.setLayout(border1); //调用添加菜单栏的方法 addMenu(frame); //调用添加北面板的方法 JTextField xianshikuang =addPanelN(frame); //监听机制类的实例化 CalculateListener al=new CalculateListener(xianshikuang); //调用中间面板 addPanelC(frame,xianshikuang,al); //调用添加东面板的方法 addPanelE(frame,al); //设置窗口关闭 frame.setDefaultCloseOperation(3); //显示窗口 frame.setVisible(true); } //定义一个添加菜单栏的方法 public void addMenu(JFrame frame){ //JPanel panelW=new JPanel(); //panelW.setPreferredSize(new Dimension(212,33)); //定义一个菜单栏并且添加到北边 JMenuBar menubar=new JMenuBar(); //定义菜单栏和子菜单栏的名称数组 String arrayMenu[]={"查看(V)","编辑(E)","帮助(H)"}; String arrayItem[][]={{"标准型","科学型","程序员","统计信息","历史记录","数学分组","基本","单位转换","日期计算","工作表"},{"复制","粘贴","历史记录"},{"查看帮助","关于计算器"}}; //将菜单添加到菜单栏上 for(int i=0;i<arrayMenu.length;i++){ JMenu menu=new JMenu(arrayMenu[i]); menubar.add(menu); for(int j=0;j<arrayItem[i].length;j++){ JMenuItem item=new JMenuItem(arrayItem[i][j]); menu.add(item); } } frame.setJMenuBar(menubar); } //北面板方法 public JTextField addPanelN(JFrame frame){ JPanel panelN = new JPanel(); frame.add(panelN,BorderLayout.NORTH); JTextField xianshikuang = new JTextField(); xianshikuang.setText("0"); panelN.setPreferredSize(new Dimension(0,64)); xianshikuang.setPreferredSize(new Dimension(195,50)); xianshikuang.setEditable(false); xianshikuang.setHorizontalAlignment(JTextField.RIGHT); xianshikuang.setFont(new Font("宋体",Font.BOLD,30)); panelN.add(xianshikuang,BorderLayout.NORTH); return xianshikuang; } //创建东边面板方法 public JPanel addPanelE(JFrame frame,CalculateListener al){ JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension (53,0)); //流布局设置 FlowLayout flow=new FlowLayout(FlowLayout.LEFT); panel.setLayout(flow); frame.add(panel,BorderLayout.EAST); String [] arrayBt={"Image/M-.jpg","Image/根号.jpg","Image/%.jpg","Image/1x.jpg","Image/=.jpg"}; for (int i=0;i<5;i++){ ImageIcon image=new ImageIcon(arrayBt[i]); JButton bt= new JButton(image); if(i!=4) bt.setPreferredSize(new Dimension(34,27)); else bt.setPreferredSize(new Dimension(34,59)); //添加监听机制 bt.setActionCommand(arrayBt[i]); bt.addActionListener(al); panel.add(bt); } return panel; } public void addPanelC(JFrame frame,JTextField xianshikuang,CalculateListener al){ JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension (168,200)); //流布局设置 FlowLayout flow=new FlowLayout(FlowLayout.RIGHT); panel.setLayout(flow); String [] arrayBt={"Image/MC.jpg","Image/MR.jpg","Image/MS.jpg","Image/M+.jpg","Image/---.jpg","Image/CE.jpg","Image/C.jpg","Image/jiajian.jpg","Image/7.jpg","Image/8.jpg","Image/9.jpg","Image/CHU.jpg","Image/4.jpg","Image/5.jpg","Image/6.jpg","Image/X.jpg","Image/1.jpg","Image/2.jpg","Image/3.jpg","Image/-.jpg","Image/0.jpg","Image/..jpg","Image/+.jpg"}; for (int i=0;i<23;i++){ ImageIcon image=new ImageIcon(arrayBt[i]); JButton bt= new JButton(image); if(i!=20) bt.setPreferredSize(new Dimension(34,27)); else bt.setPreferredSize(new Dimension(73,27)); //添加监听机制 bt.setActionCommand(arrayBt[i]); bt.addActionListener(al); panel.add(bt); } frame.add(panel,BorderLayout.CENTER); } } package windows_calculate; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JTextField; public class CalculateListener implements ActionListener { float i=1,a=0,b=0; char l=0; float y=0,x; int jilu=0; String string_y,string_a,string_b; JTextField xianshi; //构造方法 public CalculateListener (JTextField xianshikuang){ this.xianshi=xianshikuang; } //动作监听机制方法 public void actionPerformed(ActionEvent e){ //System.out.print(e.getActionCommand()); if (e.getActionCommand().equals("Image/X.jpg")) { l='*'; if(i>=1) i=-1; else i=1; if (jilu==1){ i=-1;jilu=0; } } else if (e.getActionCommand().equals("Image/CHU.jpg")){ l='/'; if(i>=1) i=-1; else i=1; if (jilu==1){ i=-1;jilu=0; } } else if (e.getActionCommand().equals("Image/-.jpg")){ l='-'; if(i>=1) i=-1; else i=1; if (jilu==1){ i=-1;jilu=0; } } else if (e.getActionCommand().equals("Image/+.jpg")){ l='+'; if(i>=1) i=-1; else i=1; if (jilu==1){ i=-1;jilu=0; } } else if (e.getActionCommand().equals("Image/=.jpg")){ if (l=='*') y=a*b; else if(l=='/') y=a/b; else if(l=='+') y=a+b; else if(l=='-') y=a-b; a=y;b=0;jilu=1; if(y==-0.0) y=0; string_y=y+""; xianshi.setText(string_y); if(i>=1) i=-1; else i=1; } //正负处理 else if (e.getActionCommand().equals("Image/jiajian.jpg")){ if(i>=1) {a=-a;xianshi.setText(a+"");} else {b=-b;xianshi.setText(b+"");} } //数字键处理 else if(i>=1){ jilu=0; x=e.getActionCommand().charAt(6)-48; for (int j=1;j<i;j++){ x=x*10; } System.out.print(i); a=a+x; xianshi.setText(a+""); i++; } else if(i<=-1){ jilu=0; x=e.getActionCommand().charAt(6)-48; for (int j=1;j<(-1)*i;j++){ x=x*10; } System.out.print(i); b=b+x; xianshi.setText(b+""); i--; } } }
相关推荐
JAVA监听机制实现一个小球的运动
java事件监听机制 java中的事件机制的参与者有3种角色: .event object:就是事件产生时具体的“事件”,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中
Java监听键盘事件可以通过使用Windows Hook机制来实现。通过设置键盘Hook,可以捕捉键盘按键事件,并将其传递给Java应用程序。Java应用程序可以通过JNI调用native方法来处理键盘事件。 四、Java监听鼠标事件 Java...
Java中的监听机制与观察者设计模式是编程中重要的概念,它们在软件开发中扮演着关键的角色,尤其是在构建可扩展和可维护的系统时。这里,我们将深入探讨这两个主题,并通过实例来阐述它们的工作原理和应用。 首先,...
【JAVA USB监听器】是一种基于Java编程语言实现的软件工具,其主要功能是对USB设备进行实时监控,当USB设备插入时,能够自动检测并复制指定类型的文件到预先设定的目录中。这种工具对于需要频繁从USB设备中获取特定...
在Java编程中,时间监听是一项重要的任务,它允许程序对系统时间的变化进行反应或执行特定操作。这通常通过注册监听器来实现,监听器是一种回调机制,当特定事件发生时,它会被调用。在Java中,我们可以使用`java....
### Java监听器基础知识与实践 #### 一、Java监听器概念 在Java中,监听器是一种用于处理特定事件的对象。当某个事件发生时(如按钮点击、键盘输入等),监听器将被调用来执行相应的操作。Java中的监听器机制是基于...
通过熟练掌握Java监听器机制,开发者可以创建更加响应用户输入的、交互性强的应用程序。 在提供的压缩包文件“05_监听器”中,可能包含更多关于Java监听器的实例代码和讲解,可以帮助深入理解这一主题。建议查看...
最近一直在搞低耦合的代码设计,后来发现JAVA中的监听器效果很不错,就特地研究了一下监听流程,后来经过调试终于成功,供大家分享下: 响应代码: /** * 事件响应运行 * @author wangchen * */ class EventRun {...
Java提供了一种称为`WatchService`的机制,它允许程序监听指定目录下的文件系统事件。通过`java.nio.file.FileSystems`和`java.nio.file.Path`类,我们可以创建并注册一个观察服务。以下是一个简单的示例: ```java...
### Java监听器基础知识与实践 #### 一、Java监听器概念 在Java中,监听器是一种用于处理事件的机制。当某个特定类型的事件发生时,监听器会执行相应的操作。这种机制广泛应用于图形用户界面(GUI)编程中,使得...
这篇博客“java监听器”可能详细解释了如何在Java中使用监听器以及它们在实际项目中的应用。 首先,我们来理解什么是Java监听器。在Java Swing或JavaFX等GUI库中,监听器是接口,实现了这些接口的类可以“监听”...
### Java监听器添加:四种监听器(内部、外部、内部匿名、自身) #### 一、引言 在Java中,监听器(Listener)是事件处理机制的重要组成部分,它主要用于响应用户或其他组件产生的事件。根据实现方式的不同,可以...
在这个"java监听者模式三个实例"中,我们将深入探讨如何使用监听者模式来实现事件驱动的编程。 1. **监听者模式的基本概念** - **观察者(Observer)**:即监听者,它定义了接口用于接收被观察者的通知。 - **被...
2.1Java的时间监听机制涉及到三个组件:事件源、事件监听器、事件对象 2.2当事件源上发生操作时,它会调用事件监听器的一个方法,并且调用这个方法时,会传递事件对象过来 2.3事件监听器是由开
总结来说,这个项目结合了Java的事件监听机制和Quartz定时任务框架,实现了根据动态条件每天执行特定任务的功能。对于Java开发者来说,理解和掌握这两个知识点对于开发高效、灵活的后台服务至关重要。
在Java编程中,监听数据库的变化是一项重要的任务,特别是在实时数据处理和系统监控的场景下。以下将详细讲解如何使用Java实现数据库监听,并提供一个代码实例作为参考。 首先,要实现数据库监听,我们需要理解两种...
在Java编程中,监听器(Listener)是一种关键的机制,它允许程序对特定事件的发生做出反应。本主题将深入探讨如何使用...理解Java监听器的概念,并结合适当的工具和技术,能帮助你构建出稳定且高效的在线人数统计系统。
下面将详细介绍几种常见的Java监听器。 #### Servlet上下文监听器(Application级) 在Servlet容器中,`ServletContext`对象代表了整个Web应用的上下文环境,它是全局唯一的。为了监控`ServletContext`生命周期内...
### Java监听器和过滤器...综上所述,Java监听器为开发者提供了强大的事件处理机制,使得Web应用程序能够更加灵活地响应各种容器级别的事件。同时,通过合理地实现国际化支持,可以显著提升软件的用户体验和适用范围。