? ? ? 一个程序最为核心的东西当然是对于事件的处理了,而事件的处理则是由事件机制来完成的。事件机制包括几个概念,一为事件源,二为事件监听方法,三为事件处理类。
? ? ? 事件源,很好理解,就是动作所发生的地方,既然要有动作发生,则必须是在图形界面上。比如说,手机游戏愤怒的小鸟,当你的手去碰触小鸟的时候,小鸟就是一个事件源。
? ? ? 事件监听方法,大致分为:1.动作监听器方法(addActionListener()),可捕获事件源(输入框)的回车和事件源(按钮)上的鼠标点击;2.鼠标监听器方法(addMouseListener(MouseListener l)),可捕获事件源上鼠标按下,释放,单击,进入和离开;3.鼠标移动监听器方法(addMouseMotionListener(MouseMotionListener l));可捕获事件源上鼠标按下拖动或者移动鼠标;4.键盘监听器方法(addKeyListener(KeyListener l)),可捕获事件源上是否有按键按下,松开。
? ? ? 最后就是事件处理类了,而说到事件处理类,就得说到接口了。接口,定义关键字为interface。接口可以继承多个接口,接口中只能定义常量和抽象(abstract)方法。抽象方法和方法的区别就在于抽象方法无方法内容,这也就意味着接口不能实例化(产生对象)。既然不能实例化,那么总得有其存在的道理,那就是接口的实现。接口的实现关键字是implements,通过别的类来实现(继承)接口。而且 一个类只能继承一个类,但能继承多个接口。而事件处理类则需要来继承事件监听接口。既然继承了接口,由于接口中有抽象方法,那么事件处理类就需要对抽象方法重写一个普通方法。
? ? ? 在运用事件机制的时候,需要注意的就是将不同的方法中需要监听的对象存放在一个事件处理类中,然后在事件处理类中进行处理。
? ? ? 下面是一个只能进行四则运算,相反数的简单计算器代码:
?
? ?
class="java" name="code">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--; } } }
?