Java 鼠标键盘事件及实例

xiecj_2006 贡献于2012-07-04

作者 微软用户  创建于2009-05-12 15:19:00   修改者jia  修改于2011-05-18 13:59:00字数8606

文档摘要:鼠标监听器鼠标监听器mouseListener监听鼠标事件MouseEvent。相应事件和处理方法如下表:鼠标事件  处理方法MOUSE_CLICKED   MouseClicked(MouseEvent)   鼠标点击(单或双)MOUSE_PRESSED   MousePressed(MouseEvent)   鼠标按下MOUSE_RELEASED  MouseReleased(MouseEvent)   鼠标松开MOUSE_ENTERED   MouseEntered(MouseEvent)   鼠标进入(某组件区域)MOUSE_EXITED    MouseExited (MouseEvent)   鼠标离开(某组件区域)鼠标事件MouseEvent常用方法intgetClickCount()  
关键词:

鼠标监听器 鼠标监听器mouseListener监听鼠标事件MouseEvent。相应事件和处理方法如下表: 鼠标事件         处理方法 MOUSE_CLICKED    MouseClicked (MouseEvent)    鼠标点击(单或双) MOUSE_PRESSED    MousePressed (MouseEvent)    鼠标按下 MOUSE_RELEASED   MouseReleased(MouseEvent)    鼠标松开 MOUSE_ENTERED    MouseEntered (MouseEvent)    鼠标进入(某组件区域) MOUSE_EXITED     MouseExited  (MouseEvent)    鼠标离开(某组件区域) 鼠标事件MouseEvent常用方法 int getClickCount()      得到点击次数1 OR 2; int getX(), int getY()   得到鼠标的(象素)位置。 对于鼠标的移动和拖放,另外用鼠标运动监听器mouseMotionListener。因为许多程序不需要监听鼠标运动,把两者分开可简化程序。有两个方法处理鼠标运动事件: MOUSE_MOVED      MouseMoved  (MouseEvent)    鼠标在移动 MOUSE_DRAGGED    MouseDragged(MouseEvent)    鼠标被拖动 下面的例程演示简单的鼠标监听,并在屏幕上输出鼠标操作的信息。 例2 下面是讨论MouseMotionListener的使用时机,它提供的下面的两个方法,可让你随时掌握鼠标的坐标,并处理拖曳鼠标的操作。 MouseMotionListener mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) ----------------------------------------------------------------------- 下面的范例让你知道鼠标在JFrame上的坐标,并拖曳出直线来。 MouseDemo3.java import java.awt.*; import java.awt.event.*; import javax.swing.*; /*为了达到画线的功能,我们分别implements MouseListener与MouseMotionListener. */ public class MouseDemo3 extends JFrame implements MouseListener,MouseMotionListener{ int flag;//flag=1代表Mouse Moved,flag=2代表Mouse Dragged int x=0; int y=0; int startx,starty,endx,endy;//起始坐标与终点坐标 public MouseDemo3(){ Container contentPane=getContentPane(); contentPane.addMouseListener(this); contentPane.addMouseMotionListener(this); setSize(300,300); show(); addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } /*由mousePressed(),mouseReleased()取得示拖曳的开始与结束坐标*/ public void mousePressed(MouseEvent e){ startx=e.getX(); starty=e.getY(); } public void mouseReleased(MouseEvent e){ endx=e.getX(); endy=e.getY(); } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mouseClicked(MouseEvent e){ } /*mouseMoved(),mouseDragged()取得鼠标移动的每一个坐标,并调用repaint()方法*/ public void mouseMoved(MouseEvent e){ flag=1; x=e.getX(); y=e.getY(); repaint(); } public void mouseDragged(MouseEvent e){ flag=2; x=e.getX(); y=e.getY(); repaint(); } public void update(Graphics g){ g.setColor(this.getBackground()); g.fillRect(0,0,getWidth(),getHeight()); paint(g); } public void paint(Graphics g){ g.setColor(Color.black); if (flag==1){ g.drawString("鼠标坐标:("+x+","+y+";)",10,50); g.drawLine(startx,starty,endx,endy); } if (flag==2){ g.drawString("拖曳鼠标价坐标:("+x+","+y+";)",10,50); g.drawLine(startx,starty,x,y); } } public static void main(String[] args){ new MouseDemo3(); } } 例3 实现一个简单的鼠标控制程序MouseController。程序功能很简单:随机移动鼠标并点击左键。 代码如下: import java.awt.AWTException; import java.awt.Dimension; import java.awt.Robot; import java.awt.Toolkit; import java.awt.event.InputEvent; import java.util.Random; /** * */ /** * @Create date 2007-11-6 */ public class MouseController implements Runnable { private Dimension dim; private Random rand; private Robot robot; private volatile boolean stop = false; public MouseController() { dim = Toolkit.getDefaultToolkit().getScreenSize(); rand = new Random(); try { robot = new Robot(); } catch (AWTException ex) { ex.printStackTrace(); } } public void run() { while(!stop) { int x = rand.nextInt(dim.width); int y = rand.nextInt(dim.height); robot.mouseMove(x, y); robot.mousePress(InputEvent.BUTTON1_MASK); try { Thread.sleep(2000); } catch (InterruptedException ex) { ex.printStackTrace(); } } } public synchronized void stop() { stop = true; } public static void main(String[] args) { MouseController mc = new MouseController(); Thre $False$ ad mcThread = new Thread(mc); System.out.println("Mouse Controller start"); mcThread.start(); try { Thread.sleep(60000); } catch (InterruptedException ex) { ex.printStackTrace(); } mc.stop(); System.out.println("Mouse Controller stoped"); } } 例4 本例程演示鼠标监听器,鼠标点击和运动的监听。 /// // MouseEvt.java import java.awt.*; import java.awt.event.*; import javax.swing.*; class MyPanel extends JPanel implements MouseMotionListener{   public MyPanel() {     addMouseListener(new MouseAdapter() {       public void mouseClicked(MouseEvent evt) {         if (evt.getClickCount() >= 2)             System.out.println("\n双击鼠标");         int x = evt.getX(); int y = evt.getY();         System.out.println("点击鼠标的位置\nX:" + x + "\ty: " + y);         }     });     addMouseMotionListener(this);   }   public void mouseMoved(MouseEvent evt){     System.out.println("\n鼠标正在移动");   }   public void mouseDragged(MouseEvent evt){     System.out.println("\n鼠标正在拖动");   } } class MyFrame extends JFrame{   public MyFrame(){     setTitle("鼠标事件示例程序");     setSize(300, 200);     addWindowListener(new WindowAdapter(){   public void windowClosing(WindowEvent e){     System.exit(0);     }   } );     Container contentPane = getContentPane();     contentPane.add(new MyPanel());   } } public class MouseEvt{     public static void main(String[] args){         JFrame frame = new MyFrame();         frame.setVisible(true);   } } /// 简要说明 在MyPanel的构建器中添加了鼠标适配器来监听鼠标点击数和位置。也添加了运动监听器来处理移动和拖放操作。 鼠标双击事件 鼠标的单双击事件在很多时候对我们帮助很大,但是在JAVA中却没有给出鼠标双击事件.我们可以通过事件源e.getClickCount()==2来判断鼠标点击次数来实现鼠标双击事件,例如: public class MyMouseListener extends java.awt.event.MouseAdapter ...{ public void mouseClicked(MouseEvent e) ...{ System.out.println("clicked"); int clickTimes = e.getClickCount(); if (clickTimes == 2) ...{ System.out.println("Doublc Clicked!"); } } } 但是这样并没有达到我们的要求,因为在每次触发双击事件的同时会触发单击事件.所以我们试图改进以上方案,不使用系统提供的e.getClickCount()方法.可以考虑当第一次单击鼠标的时候让鼠标单击事件延时0.2秒执行,而在这段时间里等待第二次单击,如果有第二次单击,那么我们执行双击事件任务,取消单击任务;如果在这段时间没有等到再次单击,那么执行单击任务. 下面是用定时器延时单击事件实现鼠标双击事件,单击和双击事件互不影响! public class MyMouseListener extends java.awt.event.MouseAdapter ...{ private static boolean flag=false;//用来判断是否已经执行双击事件 private static int clickNum=0;//用来判断是否该执行双击事件 public void mouseClicked(MouseEvent e) ...{ final MouseEvent me=e;//事件源 this.flag=false;//每次点击鼠标初始化双击事件执行标志为false if (this.clickNum == 1) ...{//当clickNum==1时执行双击事件 this.mouseDoubleClicked(me);//执行双击事件 this.clickNum=0;//初始化双击事件执行标志为0 this.flag=true;//双击事件已执行,事件标志为true return; } //定义定时器 java.util.Timer timer=new java.util.Timer(); //定时器开始执行,延时0.2秒后确定是否执行单击事件 timer.schedule(new java.util.TimerTask() ...{ private int n=0;//记录定时器执行次数 public void run() ...{ if(MyMouseListener.flag)...{//如果双击事件已经执行,那么直接取消单击执行 n=0; MyMouseListener.clickNum=0; this.cancel(); return; } if (n == 1) ...{//定时器等待0.2秒后,双击事件仍未发生,执行单击事件 mouseSingleClicked(me);//执行单击事件 MyMouseListener.flag = true; MyMouseListener.clickNum=0; n=0; this.cancel(); return; } clickNum++; n++; } },new java.util.Date(),500); } /** *//** * 鼠标单击事件 * @param e 事件源参数 */ public void mouseSingleClicked(MouseEvent e)...{ System.out.println("Single Clicked!"); } /** *//** * 鼠标双击事件 * @param e 事件源参数 */ public void mouseDoubleClicked(MouseEvent e)...{ System.out.println("Doublc Clicked!"); } } //Test.java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Test extends JFrame{ public Test(){ super("test"); init(); this.setSize(800,600); this.setVisible(true); } private void init(){ JButton b=new JButton("button"); b.setBounds(50,50,100,30); this.getContentPane().setLayout(null); this.getContentPane().add(b); b.addMouseListener(new MyMouseListener()); } public static void main(String args[]){ new Test(); } } 键盘监听器 键盘监听器KeyListener用来监听键盘事件。键盘事件有三种:KEY_PRESSED键按下了,KEY_RELEASED键松开了,KEY_TYPED键按过了。每个键都有一个键码,普通键的键码就是ASCII码。键码可通过int getKeyCode()方法获得。Java设置了一种“虚拟键码”(Virtual Key Code),用“VK_”作为前缀,例如VK_G。下面是某些特殊键的虚拟键码。 键码 含义 键码 含义 VK_LEFT/VK_RIGHT 左右方向键 VK_CONTROL Ctrl键 VK_KP_UP 小键盘向上 VK_ATL Alt键 VK_PAUSE 暂停键 VK_SHIFT Shift键 VK_NUMBER0 小键盘数字0 VK_F1 功能键F1 VK_0 数字键0 VK_B 字母键B  虚拟键码对应的是键位,不区分大小写。要想知道大小写还必须查看修饰键(modifier key)。这由输入事件InputEvent的getModifere()方法得到,把返回值与常量SHIFT_MASK, CONTROL_MASK, ALT_MASK比较,用以判定哪个修饰键处于“同时按下”状态。 监听器KeyListener有三个方法keyPressed(KeyEvent evt),keyReleased(KeyEvent evt),keyTyped(KeyEvent evt),分别用于相应事件发生后的处理。下面的例程中给自己的键盘监听器建立了showKeyEventMsg方法来显示按键信息。 除了getKeyCode()方法得到键码外,还可用getKeyChar()方法得到输入的字符,用getKeyText(code)方法得到输入的字符串。用isShiftDown()判断shift键是否被按下等。当按下Control键时getKeyText返回的是“ctrl",Alt和Shift也类似。 下面的例子演示得到键码和字符的方法,在命令行上显示结果。 例1 本例程演示键盘监听器后键码的用法。 /// // KeyEvt.java import java.awt.*; import java.awt.event.*; import javax.swing.*; class MyKeyListener implements KeyListener{   public void keyPressed(KeyEvent evt) {     System.out.println("\n按键被按下");     showKeyEventMsg(evt);   }   public void keyReleased(KeyEvent evt){ }   public void keyTyped(KeyEvent evt) { }   private void showKeyEventMsg(KeyEvent evt){//显示按键事件信息     //得到按键对应的整型数     int code = evt.getKeyCode();     //返回按键事件所代表的字符     char c = evt.getKeyChar();     //得到代表按键的字符串     String szText = evt.getKeyText(code);     if (code != KeyEvent.VK_UNDEFINED)         System.out.println("\n按键对应的整型数:"+code);     if (c != KeyEvent.CHAR_UNDEFINED)         System.out.println("\n与按键相联系的字符:"+c);     if (evt.isShiftDown())         System.out.println("\n按键Shift被按下");     System.out.println("\n按键本身的字符串:"+szText);   } } class ButtonPanel extends JPanel{     public ButtonPanel() {     //新建一个文本域组件     tf = new JTextField(20);     add(tf);     //指定用来处理该按钮事件的监听器对象为JPanel本身     myListener = new MyKeyListener();     tf.addKeyListener(myListener);   }     private JTextField tf;     private MyKeyListener myListener;   } class ButtonFrame extends JFrame{   public ButtonFrame() {     setTitle("键盘事件示例程序");     setSize(300, 200);     setLocation(100,100);     addWindowListener(new WindowAdapter() {   public void windowClosing(WindowEvent e)     { System.exit(0);   }   });     Container ctPane = getContentPane();     ctPane.add(new ButtonPanel());  } } public class KeyEvt{   public static void main(String[] args) {     JFrame frame = new ButtonFrame();     frame.setVisible(true);   } } ///简要说明 1. 程序建立了自己的键盘监听器MyKeyListener,定义了一个新方法showKeyEventMsg用来在标准输出设备上显示有关的键盘信息。 2. 在面版ButtonPanel上建立文本框并加键盘监听器。把面版ButtonPanel放到窗口ButtonFrame中。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档