Java语言6响应用户输入.ppt_第1页
Java语言6响应用户输入.ppt_第2页
Java语言6响应用户输入.ppt_第3页
Java语言6响应用户输入.ppt_第4页
Java语言6响应用户输入.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java语言程序设计,资源与环境科学学院,第六章 响应用户输入,一个简单的界面程序,import java.awt.*; public class TestFrame public static void main(String args) Frame f = new Frame(“My Frame Programming!“); f.add(new Button(“ok“); f.setSize(300,300); f.setVisible(true); / f.dispose(); /释放窗口,加上这句后窗口闪下消失 ,此时点击button或者点击关闭窗口都没有响应,只有最大化,最小化有响应。,AWT事件处理机制, 三个重要的概念 事件:用户对组件的一个操作,称之为一个事件 事件源:发生事件的组件就是事件源。 事件处理器:某个Java类中的负责处理事件的成员方法。 事件,事件源,事件处理器之间的关系,事件分类, 按产生事件的物理操作和GUI组件的表现效果分类 MouseEvent WindowEvent ActionEvent 按事件的性质分类: 低级事件 语义事件(又叫高级事件),在java.awt.event中列出多种事件,如果事件的监听器中有多个方法,则为低级事件,如果只有一个方法就为语义事件。,事件监听器, 一个事件监听器对像负责处理一类事件。 一类事件的每一种发生情况,分别由事件监听器对象中的一个方法来具体处理。 在事件源和事件监听器对象中进行约定的接口类,被称为事件监听器接口。书P193 事件监听器接口类的名称与事件类的名称通常是相对应的。例如MouseEvent事件类的监听器接口名为MouseListener。,创建事件监听器类,import java.awt.Window; /myWindowListener.java文件 import java.awt.event.*; public class myWindowListener implements WindowListener public void windowOpened(WindowEvent e) public void windowClosing(WindowEvent e) e.getWindow().setVisible(false); (Window)e.getComponent().dispose(); System.exit(0); public void windowActivated(WindowEvent e) public void windowClosed(WindowEvent e) public void windowDeactivated(WindowEvent e) public void windowDeiconified(WindowEvent e) public void windowIconified(WindowEvent e) ,添加事件监听器,import java.awt.*; /打开上例中的TestFrame.java程序 public class TestFrame public static void main(String args) Frame f = new Frame(“My Frame Programming!“); f.add(new Button(“ok“); f.setSize(300,300); f.setVisible(true); f.addWindowListener(new myWindowListener(); ,运行后可以顺利的关闭窗口,事件监听器编写流程, 处理发生在某个GUI组件上的*Event事件的某种情况,其事件处理的通用编写流程。 编写一个实现了*Listener接口的事件监听器类; *Listener类中的用于处理该事件情况的方法中,编写处理代码; 调用组件的add*Listener方法,将类 *Listener创建的实例对象注册到GUI组件上。,事件适配器, JDK中也提供了大多数事件监听器接口的最简单的实现类,称之为事件适配器(Adapter)类。 用事件适配器来处理事件,可以简化事件监听器编写。 在AWT中就经常用到声明和实现多个接口。无论实现了几个接口,接口中已定义的方法必须一一实现,如果对某事件不感兴趣,可以不具体实现其方法,而用空的方法体来代替,但却必须所有方法都要写上。这样一来会有一些不便,为了解决这个问题,AWT使用了适配器(Adapter),Java语言为一些Listener接口提供了适配器类(Adapter)。可以通过继承事件所对应的Adapter类,重写所需要的方法,无关的方法则不用实现。,事件适配器,/编写一个采用适配器的YourWindowListener.java类 import java.awt.event.WindowAdapter; import java.awt.event.*; public class YourWindowListener extends WindowAdapter public void windowClosing(WindowEvent e) e.getWindow().dispose(); System.exit(0); ,事件适配器,import java.awt.*; public class TestFrame public static void main(String args) Frame f = new Frame(“My Frame Programming!“); f.add(new Button(“ok“); f.setSize(300,300); f.setVisible(true); / f.addWindowListener(new myWindowListener(); f.addWindowListener(new YourWindowListener (); ,事件适配器, 事件适配器类的不足之处: Java不允许一个类继承多个类,因此当一个类已经继承了别的类,就不能再使用事件适配器类,此时只能使用事件监听器接口。 如果*Listener接口中只有一个方法,可以采用事件监听器,没有必要使用事件适配器。因此对于*Listener接口中只有一个方法,是没有事件适配器类的。,在事件监听器中访问非事件源的其他GUI组件,import java.awt.*; import java.awt.event.*; /为button按钮添加关闭窗口的事件 public class TestFrame implements ActionListener public static void main(String args) Frame f = new Frame(“My Frame Programming!“); f.add(new Button(“ok“); f.setSize(300,300); f.setVisible(true); f.addWindowListener(new YourWindowListener (); public void actionPerformed(ActionEvent e) 书P194 f.dispose() System.exit(0); ,判断是否正确? 此函数中 f 在哪里定义?Btn是否关联事件?,在事件监听器中访问非事件源的其他GUI组件,import java.awt.*; import java.awt.event.*; /为button按钮添加关闭窗口的事件 public class TestFrame implements ActionListener Frame f = new Frame(“My Frame Programming!“); public static void main(String args) TestFrame tf = new TestFrame(); Button btn = new Button(“ok“); tf.f.add(btn); tf.f.setSize(300,300); tf.f.setVisible(true); tf.f.addWindowListener(new YourWindowListener(); btn.addActionListener( tf ); public void actionPerformed(ActionEvent e) f.dispose() System.exit(0); ,注意:该写法结构不太好,可以改写,内部类 实现事件处理,内部类(Inner Class)是被定义于另一个类中的类,使用内部类的主要原因是由于: 一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员; 实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能;编写事件驱动程序,内部类很方便。 内部类所能够应用的地方往往是在AWT的事件处理机制中。,在事件监听器中访问非事件源的其他GUI组件,import java.awt.*; import java.awt.event.*; /为button按钮添加关闭窗口的事件 public class TestFrame Frame f = new Frame(“My Frame Programming!“); public static void main(String args) TestFrame tf = new TestFrame(); tf.init() ; public void init() Button btn = new Button(“ok“); btn.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) f.dispose(); System.exit(0); ); f.add(btn); f.setSize(300,300); f.setVisible(true); f.addWindowListener(new YourWindowListener(); ,事件处理, 一个组件上的一个动作可以产生多种不同类型的事件。 一个事件监听器对象可以注册到多个事件源上。 在一个事件源上也可以注册对同一类事件进行处理的多个事件监听器对象。,GUI组件的图形操作,Graphics类与图形绘制, Component.getGraphics方法,将返回Graphics类对象。 Graphics.drawLine(int x1,int y1,int x2,int y2)方法。 Graphics.drawString(String str,int x,int y)方法。 注意:drawString方法的坐标参数中(x,y)为文本的左下角。 编程举例:以鼠标在窗口中按下时的位置作为起始点,鼠标释放时的位置作为终止点,在鼠标释放时将直线画出,并在每条直线的起始和终止点位置上打印出它们的坐标值。,Graphics类与图形绘制, 鼠标事件,任何组件都可以激发这些事件。 类通过接口 MouseListener 来实现,也可以通过适配器 MouseAdapter()类来实现。 按下鼠标事件 mousePressed(MouseEvent e); 释放鼠标事件 mouseReleased(MouseEvent e); 其他方法参见 p200,Graphics类与图形绘制,import java.awt.*; import java.awt.event.*; public class DrawLine Frame f = new Frame(“绘图工具”); /指定绘图工具的画面 public static void main(String args) new DrawLine().init(); public void init() f.setSize(300,300); f.setVisible(true); f.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) e.getWindow().dispose(); /添加窗口关闭事件 System.exit(0); );,Graphics类与图形绘制,f.addMouseListener(new MouseAdapter() /添加鼠标事件 int orgX,orgY; public void mousePressed(MouseEvent e) orgX = e.getX(); orgY = e.getY(); public void mouseReleased(MouseEvent e) Graphics g = f.getGraphics() ; g.setColor(Color.RED); g.drawLine(orgX,orgY,e.getX(),e.getY(); ); ,g.drawString(orgX+“,“+orgY,orgX,orgY); g.drawString(e.getX()+“,“+e.getY(),e.getX(),e.getY();,g.setFont(new Font(null,Font.ITALIC|Font.BOLD,30);,组件的重绘, 上面的实例当窗口最小化等操作后,图形消失了,需要进行组件的重绘。 paint(Graphics g)进行组件的重绘。paint()方法将图形的内容重新绘制。 AWT线程对组件重绘的调用过程。Paint()方法是由AWT线程调用管理的,应用程序并不直接调用paint()方法,应用程序调用repaint()方法,由repaint()调用update()后再调用paint()方法。,组件的重绘,import java.awt.*; import java.awt.event.*; public class DrawLine extends Frame / Frame f = new Frame(“绘图工具”); /删除该语句 int orgX,orgY,endX,endY; public static void main(String args) new DrawLine().init(); public void init() this.addMouseListener(new MouseAdapter() public void mouseReleased(MouseEvent e) endX = e.getX(); endY = e.getY(); Graphics g = getGraphics() ;); public void paint(Graphics g) g.drawLine(orgX,orgY,endX,endY); ,只绘制了最后一条直线,所有线的重绘, 在上次写的 Myline类 中添加 drawMe()的方法,实现一条线的绘制工作。 将鼠标绘制的每一条线都记录到Myline类中,添加一个矢量 Vector 记录所有Myline类集合。 添加paint()方法,在该方法中调用 Myline类集合中的drawMe()的方法,绘制每一条线。,所有线的重绘,/编写一个线段类 MyLine import java.awt.Point; import java.awt.*; public class myline Point pnt1; Point pnt2; /添加绘制直线的方法 public void drawMe(Graphics g) g.drawLine(pnt1.x,pnt1.y,pnt2.x,pnt2.y); ,所有线的重绘,import java.awt.*; import java.awt.event.*; import java.util.*; public class Redrawline extends Frame Vector vLines=new Vector(); public static void main(String args) new Redrawline().init(); public void paint(Graphics g) g.setColor(Color.red); Enumeration e=vLines.elements(); while(e.hasMoreElements() myline oneline=(myline)e.nextElement(); oneline.drawMe(g); ,所有线的重绘,public void init() addWindowListener( new WindowAdapter() public void windowClosing(WindowEvent e) (Window)e.getSource().dispose(); System.exit(0); ); addMouseListener( new MouseAdapter() int orgX,orgY; public void mousePressed(MouseEvent e) orgX=e.getX();orgY=e.getY(); public void mouseReleased(MouseEvent e) Graphics g=e.getComponent().getGraphics(); g.setColor(Color.red); g.drawLine(orgX,orgY,e.getX(),e.getY(); vLines.add(new myline(orgX,orgY,e.getX(),e.getY(); ); this.setSize(300,300); setVisible(true); ,图像显示, 使用Graphics.drawImage(Image img,int x,int y,ImageObserver observer)方法显示图像。 import java.awt.*; import java.awt.event.*; public class DrawImage extends Frame Image img=null; public static void main(String args) new DrawImage().init(); ,X,Y左上角坐标;Observer用于监视图像创建进度的对象。,图像显示,public void init() img=this.getToolkit().getImage(“c:test.gif“); setSize(300,300); setVisible(true); this.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) dispose(); System.exit(0); ); public void paint(Graphics g) getGraphics().drawImage(img,0,0,this); ,菜单, 一个完整的菜单系统由菜单条、菜单和菜单项组成,它们之间的关系如图: Java中与菜单相关的类主要有:MenuBar(菜单条) Menu(菜单) Menultem(菜单项)。,菜单,import java.awt.*; import java.awt.event.*; public class TestMenuBar MenuBar menubar=new MenuBar(); /创建菜单条对象 Menu fileM=new Menu(“File“); /创建各菜单 Menu editM=new Menu(“Edit“); /创建各菜单 MenuItem fileMI1=new MenuItem(“New“); /创建各菜单项 CheckboxMenuItem fileMI5=new CheckboxMenuItem(“Quit“,true); Menu filePrint = new Menu(“print“);/创建子菜单 MenuItem printM1 = new MenuItem(“preview“); MenuItem printM2 = new MenuItem(“setting“); public static void main(String args) new TestMenuBar(); ,菜单,TestMenuBar() FlowLayout fl=new FlowLayout(); Frame f=new Frame(“TestMenuBar“); f.setLayout(fl); menubar.add(fileM); /将菜单加入菜单条 menubar.add(editM); fileM.add(fileMI1); /将菜单项加入file菜单中 filePrint.add(printM1);/将菜单项加入print菜单中 filePrint.add(printM2); fileM.add(filePrint); /将print菜单作为菜单项加入file菜单 fileM.addSeparator(); /将一条分割线加入菜单中 fileM.add(fileMI5); /将菜单项加入菜单中 f.setMenuBar(menubar); /把整个菜单系统显示在窗口中 f.setBounds(0,0,250,200); f.setVisible(true); f.addWindowListener(new WindowAdapter(); ,为菜单添加事件, 编写一个MenuListener类,作为菜单事件响应类。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MenuListener implements ActionListener public void actionPerformed(ActionEvent e) if( e.getActionCommand().equals(“preview“) ) System.out.println(“doing preview“); else if(e.getActionCommand().equals(“setting“) System.out.println(“doing Setting“); ,为菜单添加事件, 将事件类MenuListener与组件进行关联 import java.awt.*; import java.awt.event.*; public class TestMenuBar TestMenuBar() filePrint.add(printM1); /将菜单项加入print菜单中 filePrint.add(printM2); fileM.add(filePrint); /将print菜单作为菜单项加入file菜单中 MenuListener m1 = new MenuListener(); printM1.addActionListener(m1); pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论