一个程序最为核心的东西当然是对于事件的处理了,而事件的处理则是由事件机制来完成的。事件机制包括几个概念,一为事件源,二为事件监听方法,三为事件处理类。
事件源,很好理解,就是动作所发生的地方,既然要有动作发生,则必须是在图形界面上。比如说,手机游戏愤怒的小鸟,当你的手去碰触小鸟的时候,小鸟就是一个事件源。
事件监听方法,大致分为: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中的监听机制以及观察者设计模式
最近一直在搞低耦合的代码设计,后来发现JAVA中的监听器效果很不错,就特地研究了一下监听流程,后来经过调试终于成功,供大家分享下: 响应代码: /** * 事件响应运行 * @author wangchen * */ class EventRun {...
2.1Java的时间监听机制涉及到三个组件:事件源、事件监听器、事件对象 2.2当事件源上发生操作时,它会调用事件监听器的一个方法,并且调用这个方法时,会传递事件对象过来 2.3事件监听器是由开
关于JAVA中事件分发和监听机制实现的代码实例,绝对实用代码,有说明。
JAVA事件处理机制 事件监听器 事件监听器适配器
Spring框架作为Java开发的核心,其事件监听机制是理解和利用Spring的关键要素之一。这种机制基于观察者模式,由事件(ApplicationEvent)、事件监听器(ApplicationListener)和事件广播器...
下面小编就为大家带来一篇详谈Java中的事件监听机制。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java中的事件、事件监听器的简单实现例子,希望对新人有所帮助吧。
Java事件处理机制- 事件监听器的四种实现方式 分析的非常好
java事件处理机制ppt 有3种角色: 1.event object:就是事件产生时具体的“事件”,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中 2.event source:具体的接受事件的实体,比如说,你...
我们在编写JSP/Servle程序时,有相应的事件处理机制,在JSP/Servlet中是在web.xml中注册Listener,由Container在特定事件发生时呼叫特定的实现Listener的类。
主要介绍了Java实现心跳机制的方法,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
Spring使用ApplicationEvent和ApplicationListener两个核心接口实现了事件监听机制。开发者可以自定义事件类和事件监听器,并通过应用程序上下文的publishEvent方法来发布事件,Spring框架会自动分发事件给所有对该...
java写的websocket客户端,包含心跳监测。 此架包可解决问题:系统使用websocket 访问远程上的实时数据,但是有时候会停止更新实时数据,只要重启了自己的系统,就会继续更新数据了,此包可以完美解决此问题。
listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的...
通过分析数据库安全审计机制,提出一种基于旁路监听的数据库安全审计系统框架,并实现了针对Oracle数据库的安全审计系统。涉及Java网络抓包、TNS协议解析、SQL语法解析和数据库安全检测等技术实现,提出一种发现用户...
Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...