单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2012-11-17,*,赵志崑,计算机科学与技术学院,赵志崑,Java,程序设计,GUI,组件概述,awt:Abstract,Window Toolkit,抽象窗口工具集,从,Java1.0,中出现。,awt,处理用户界面元素的方法是把这些元素的创建和行为委托给每个目标平台(如,windows,Linux),上的本地,GUI,处理。,每个平台提供的图形界面元素都不一样。,不同平台上的,awt,库存在不同,Bug。,awt,的事件处理模型在,Java1.1,版进行了大的改动后,到目前的版本基本没变。,swing:,Java 2.0,中出现。,Swing,组件全部是由纯,Java,编写的,用户界面元素都绘制在空白窗口上,绘制和行为都由,swing,类自己完成。各平台之间唯一不同的就是最外层窗口的创建。,总结:,尽管,awt,的用户界面组件仍然可以用,但是建议最好不要使用。,现在编写,Java,图形界面程序,,使用,swing,组件+,awt,事件处理模型,。,事件处理概述,图形用户界面编程中,必须使用事件处理。,程序的执行不是一条连续的线,而是很多独立的片段。,支持,GUI,的操作环境会不断监视事件,并把事件报告给正在运行的程序。这是多任务的需要。,每个程序自己决定如何响应这些事件。,Java,的事件处理采用的是事件监听器方式。,事件监听器,是一个实现了监听器接口的对象。,事件源,(如按钮组件)是一个能够注册监听器并为它们发送事件的对象(可视构件)。,每个事件源拥有自己的事件监听器,可以有多个。,当事件源产生了一个事件后,事件源就会给所有监听器对象发送通知,即调用事件监听器对象的相应方法。,事件,的信息被封装在一个对象中,不同事件源能够产生不同种类的事件。,编程人员要做的就是,编写事件监听器类,创建一个事件监听器对象,并添加到相应的事件源,。,事件源,事件,监听器,事件,事件监听器编写,编写事件处理程序的步骤如下:,编写监听器类;,在监听器类中实现接口中需要的方法;,方法中可以使用,ActionEvent,对象获取事件参数;,创建一个事件监听器对象;,将该对象添加到事件源。,见,Example1.java,import,java.awt,.*;,import,java.awt.event,.*,;,import,javax.swing,.*;,public class Example1 extends,JFrame,public Example1(),setSize(320,200);,setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE,);,Container,contentPane,=,getContentPane,();,JButton,testButton,=new,JButton(Test,);,testButton.,addActionListener,(,new,MyListener1(),),;,contentPane.setLayout(new,BorderLayout,();,contentPane.add(testButton,BorderLayout.SOUTH,);,class MyListener1,implements,ActionListener,public void,actionPerformed,(,ActionEvent,e,),JOptionPane.showMessageDialog(null,ActionCommand:+,e.getActionCommand,(),);,事件源与监听器的关系,一个事件源可以对应多个监听器。,一个监听器可以对应多个事件源。,class MyListener2 implements,ActionListener,public void,actionPerformed(ActionEvent,e),String,actionCommand,=,e.getActionCommand,();,Color,bkColor,=null;,if(actionCommand.equals(Red)bkColor,=new Color(255,0,0);,else,if(actionCommand.equals(Green)bkColor,=new Color(0,255,0);,else,if(actionCommand.equals(Blue)bkColor,=Color.blue;,getContentPane(),.setBackground(bkColor,);,见,Example2.java,class MyListener1 implements,ActionListener,public void,actionPerformed(ActionEvent,e),JOptionPane.showMessageDialog(null,ActionCommand:+e.getActionCommand,();,myListener2,myListener1,事件监听机制,button,l1,l2,public class Listener1 implements,ActionListener,public void,actionPerformed(ActionEvent,e),事件源:,当事件发,生时事件源自动调用,监听器列表中各个对,象的相应方法,列表(,LinkedList,):,事件源的,addActionListener,方法可以将监听器对象添,加到列表中,监听器对象,监听器类,interface,ActionListener,void,actionPerformed(,ActionEvent,e,);,监听器接口,class,ActionEvent,事件类,事件监听器类的各种写法,监听器类的声明:,将事件监听器作为单独的类。,将事件监听器作为组件的内部类。,直接使用已有类(通常是包含事件源的组件)作为事件监听器。,使用匿名内部类。,监听器类的实现:,一个监听器类实现多个组件的监听器对象。,通过类中的实例字段来区分不同的监听器对象。,一个监听器对象作为多个组件的监听器。,在事件的响应方法中通过事件源区分不同的事件。,public class Example1 extends,JFrame,implements,ActionListener,public void,actionPerformed(ActionEvent,e),见,Example3.java,redButton.addActionListener(new,ActionListener,(),/,匿名内部类监听器,public void,actionPerformed(ActionEvent,e),);,改变观感,改变观感使用两个静态方法:,UIManager.setLookAndFeel(plaf,),设置要使用的观感,参数,plaf,为观感的名字,实际为一个类名,可以为以下字符串:,javax.swing.plaf.metal.MetalLookAndFeel,com.sun.java.swing.plaf.windows.WindowsLookAndFeel,com.sun.java.swing.plaf.motif.MotifLookAndFeel,SwingUtilities.updateComponentTreeUI(panel,),刷新要改变的组件,参数,panel,给出面板中的一个组件即可刷新整个面板。,见,Example4.java,tButton.addActionListener(new,ActionListener,(),public void,actionPerformed(ActionEvent,aEvent,),try,UIManager.setLookAndFeel,(aPlafName,);,SwingUtilities.updateComponentTreeUI,(Example4.this);,catch(Exception e),e.printStackTrace,();,;,);,窗口事件,ActionListener,接口非常简单,用于按钮事件处理。,相应的,,WindowListener,接口用于窗口事件处理。,见,Example5.java,public class Example5 extends,JFrame,public Example5(),setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE,);,addWindowListener,(new,MyWindowListener,();,private class,MyWindowListener,implements,WindowListener,public void,windowOpened,(WindowEvent,e),public void,windowClosing,(WindowEvent,e),int,result=,JOptionPane.showConfirmDialog,(,);,if(result=JOptionPane.OK_OPTION)System.exit(0);,public void,windowClosed,(WindowEvent,e),public void,windowIconified,(WindowEvent,e),public void,windowDeiconified,(WindowEvent,e),public void,windowActivated,(WindowEvent,e),public void,windowDeactivated,(WindowEvent,e),添加窗口事件监听器,窗口事件监听器实现,WindowListener,接口,要处理的窗口事件,适配器类,问题:仅仅需要处理关闭窗口事件,但却要写另外六个空方法。,解决方法:使用适配器类。,适配器类是一个实现了某个接口,但其中所有方法都为空的类。,每个具有不止一个方法的监听器接口都对应有一个适配器类。,编写监听器类时只需从适配器类派生一个子类即可。,见,Example6.java,private class,MyWindowListener,extends,WindowAdapter,public void,windowClosing(WindowEvent,e),int,result=,JOptionPane.showConfirmDialog,(,);,if(result=JOptionPane.OK_OPTION)System.exit(0);,由实现接口改为,继承自适配器类,,从而不用再写另,外六个无用方法。,见,Example6.java,addWindowListener(,new,WindowAdapter,(),public void,windowClosing(WindowEvent,e),int,result=,JOptionPane.showConfirmDialog,(,);,if(result=JOptionPane.OK_OPTION)System.exit(0);,);,也可写成,匿名内部类,WindowListener,WindowAdapter,MyWindowAdapter,Java,事件概述,Java,中所有事件都从,java.util.EventObject,类继承而来。,两个包中定义了事件:,java.awt.event:awt,的事件、监听器及适配器定义。,java.swing.event:,专门用于,swing,组件的附加事件。,如何查找组件能够产生哪些事件:,查找组件能够添加哪些事件监听器(,add*Listener),根据