Java知多少(93)鼠标事件

鼠标事件的事件源往往与容器相关,当鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口。

MouseListener接口

MouseListener接口能处理5种鼠标事件:按下鼠标,释放鼠标,点击鼠标、鼠标进入、鼠标退出。相应的方法有:
(1) getX():鼠标的X坐标
(2) getY():鼠标的Y坐标
(3) getModifiers():获取鼠标的左键或右键。
(4) getClickCount():鼠标被点击的次数。
(5) getSource():获取发生鼠标的事件源。
(6) addMouseListener(监视器):加放监视器。
(7) removeMouseListener(监视器):移去监视器。

要实现的MouseListener接口的方法有:
(1) mousePressed(MouseEvent e);
(2) mouseReleased(MouseEvent e);
(3) mouseEntered(MouseEvent e);
(4) mouseExited(MouseEvent e);
(5) mouseClicked(MouseEvent e);

【例 11-18】小应用程序设置了一个文本区,用于记录一系列鼠标事件。当鼠标进入小应用程序窗口时,文本区显示“鼠标进来”;当鼠标离开 窗口时,文本区显示“鼠标走开”;当鼠标被按下时,文本区显示“鼠标按下”,当鼠标被双击时,文本区显示“鼠标双击”;并显示鼠标的坐标。程序还显示一个红色的圆,当点击鼠标时,圆的半径会不断地变大。

 1 import java.applet.*;
 2 import javax.swing.*;
 3 import java.awt.*;
 4 import java.awt.event.*;
 5 class MyPanel extends JPanel{
 6     public void print(int r){
 7         Graphics g = getGraphics();
 8         g.clearRect(0,0,this.getWidth(),this.getHeight());
 9         g.setColor(Color.red);
10         g.fillOval(10,10,r,r);
11     }
12 }
13 class MyWindow extends JFrame implements MouseListener{
14     JTextArea text;
15     MyPanel panel;
16     int x,y,r =10;
17     int mouseFlg=0;
18     static String mouseStates[]={"鼠标键按下","鼠标松开","鼠标进来","鼠标走开","鼠标双击"};
19     MyWindow(String s){
20         super(s);
21         Container con = this.getContentPane();
22         con.setLayout(new GridLayout(2,1));
23         this.setSize(200,300);
24         this.setLocation(100,100);
25         panel = new MyPanel();
26         con.add(panel);
27         text = new JTextArea(10,20);
28         text.setBackground(Color.blue);
29         con.add(text);
30         addMouseListener(this);
31         this.setVisible(true);
32         this.pack();
33     }
34     public void paint(Graphics g){
35         r = r+4;
36         if(r>80){
37             r=10;
38         }
39         text.append(mouseStates[mouseFlg]+"了,位置是:" +x+","+y+"\n");
40         panel.print(r);
41     }
42     public void mousePressed(MouseEvent e){
43         x = e.getX();
44         y = e.getY();
45         mouseFlg = 0;
46         repaint();
47     }
48     public void mouseRelease(MouseEvent e){
49         x = e.getX();
50         y = e.getY();
51         mouseFlg = 1;
52         repaint();
53     }
54     public void mouseEntered(MouseEvent e){
55         x = e.getX();
56         y = e.getY();
57         mouseFlg = 2;
58         repaint();
59     }
60     public void mouseExited(MouseEvent e){
61         x = e.getX();
62         y = e.getY();
63         mouseFlg = 3;
64         repaint();
65     }
66     public void mouseClicked(MouseEvent e){
67         if(e.getClickCount()==2){
68             x = e.getX();
69             y = e.getY();
70             mouseFlg = 4;
71             repaint();
72         }
73         else{}
74     }
75 }
76 public class Example6_8 extends Applet{
77     public void init(){
78         MyWindow myWnd = new MyWindow("鼠标事件示意程序");
79     }
80 }

任何组件上都可以发生鼠标事件:鼠标进入、鼠标退出、按下鼠标等。例如,在上述程序中添加一个按钮,并给按钮对象添加鼠标监视器,将上述程序中的init()方法修改成如下形式,即能示意按钮上的所有鼠标事件。

1 JButton button;
2 public void init(){
3     button = new JButton(“按钮也能发生鼠标事件”);
4     r = 10;
5     text = new JTextArea(15,20);
6     add(button);
7     add(text);
8     button.addMouseListener(this);
9 }

如果程序希望进一步知道按下或点击的是鼠标左键或右键,鼠标的左键或右键可用InputEvent类中的常量BUTTON1_MASK和BUTTON3_MASK来判定。例如,以下表达式判断是否按下或点击了鼠标右键:

e.getModifiers()==InputEvent. BUTTON3_MASK

MouseMotionListener接口

MouseMotionListener接口处理拖动鼠标和鼠标移动两种事件。

注册监视器的方法是:
    addMouseMotionListener(监视器)
要实现的的接口方法有两个:
(1) mouseDragged(MouseEvent e)
(2) mouseMoved(MouseEvent e)

【例 11-19】一个滚动条与显示窗口同步变化的应用程序。窗口有一个方块,用鼠标拖运方块,或用鼠标点击窗口,方块改变显示位置,相应水平和垂直滚动条的滑块也会改变它们在滚动条中的位置。反之,移动滚动条的滑块,方块在窗口中的显示位置也会改变。

 1 import java.applet.*;
 2 import javax.swing.*;
 3 import java.awt.*;
 4 import java.awt.event.*;
 5 class MyPanel extends JPanel{
 6     public void print(int r){
 7         Graphics g = getGraphics();
 8         g.clearRect(0,0,this.getWidth(),this.getHeight());
 9         g.setColor(Color.red);
10         g.fillOval(10,10,r,r);
11     }
12 }
13 class MyWindow extends JFrame implements MouseListener{
14     JTextArea text;
15     MyPanel panel;
16     int x,y,r =10;
17     int mouseFlg=0;
18     static String mouseStates[]={"鼠标键按下","鼠标松开","鼠标进来","鼠标走开","鼠标双击"};
19     MyWindow(String s){
20         super(s);
21         Container con = this.getContentPane();
22         con.setLayout(new GridLayout(2,1));
23         this.setSize(200,300);
24         this.setLocation(100,100);
25         panel = new MyPanel();
26         con.add(panel);
27         text = new JTextArea(10,20);
28         text.setBackground(Color.blue);
29         con.add(text);
30         addMouseListener(this);
31         this.setVisible(true);
32         this.pack();
33     }
34     public void paint(Graphics g){
35         r = r+4;
36         if(r>80){
37             r=10;
38         }
39         text.append(mouseStates[mouseFlg]+"了,位置是:" +x+","+y+"\n");
40         panel.print(r);
41     }
42     public void mousePressed(MouseEvent e){
43         x = e.getX();
44         y = e.getY();
45         mouseFlg = 0;
46         repaint();
47     }
48     public void mouseRelease(MouseEvent e){
49         x = e.getX();
50         y = e.getY();
51         mouseFlg = 1;
52         repaint();
53     }
54     public void mouseEntered(MouseEvent e){
55         x = e.getX();
56         y = e.getY();
57         mouseFlg = 2;
58         repaint();
59     }
60     public void mouseExited(MouseEvent e){
61         x = e.getX();
62         y = e.getY();
63         mouseFlg = 3;
64         repaint();
65     }
66     public void mouseClicked(MouseEvent e){
67         if(e.getClickCount()==2){
68             x = e.getX();
69             y = e.getY();
70             mouseFlg = 4;
71             repaint();
72         }
73         else{}
74     }
75 }
76 public class Example6_8 extends Applet{
77     public void init(){
78         MyWindow myWnd = new MyWindow("鼠标事件示意程序");
79     }
80 }

上述例子中,如果只要求通过滑动滑块,改变内容的显示位置,可以简单地使用滚动面板JScrollPane。如果是这样,关于滚动条的创建和控制都可以免去,直接由JScrollPane内部实现。参见以下修改后的MyWindow的定义:

 1 class MyWindow extends JFrame{
 2     public MyWindow(String s){
 3         super(s);
 4         Container con = this.getContentPane();
 5         con.setLayout(new BorderLayout());
 6         this.setLocaltion(100,100);
 7         MyListener listener = new MyListener();
 8         listener.setPreferredSize(new Dimension(700,700));
 9         JScrollPane scrolledCanvas = new JScrollPane(listener);
10         this.add(scrolledCanvas,BorderLayout.CENTER);
11         this.setVisible(true);
12         this.pack();
13     }
14     public Dimension getPreferredSize(){
15         return new Dimension(400,400);
16     }
17 }

鼠标指针形状也能由程序控制 ,setCursor()方法能设置鼠标指针形状。例如,代码setCursor(Cursor.getPredefinedCursor(cursor.WAIT_CURSOR))。

系列文章:

Java知多少(上)

Java知多少(中)

Java知多少(78)Java向量(Vector)及其应用

Java知多少(79)哈希表及其应用

Java知多少(80)图形界面设计基础

Java知多少(81)框架窗口基础

Java知多少(82)标签、按钮和按钮事件简介

Java知多少(83)面板基础:JPanel和JScrollPane

Java知多少(84)图形界面之布局设计

Java知多少(85)文本框和文本区

Java知多少(86)文本框和文本区的输入输出

Java知多少(87)选择框和单选按钮

Java知多少(88)列表和组合框

Java知多少(89)列表和组合框

Java知多少(90)菜单

Java知多少(91)对话框

Java知多少(92)滚动条

时间: 2024-10-13 12:29:16

Java知多少(93)鼠标事件的相关文章

7.JAVA之GUI编程鼠标事件

鼠标事件: 功能: 1.基本窗体功能实现 2.鼠标移动监听,当鼠标移动到按钮上时,触发打印事件. 3.按钮活动监听,当按钮活动时,触发打印事件. 4.按钮被单击时触发打印事件. 源码如下: import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import

十. 图形界面(GUI)设计13.鼠标事件

鼠标事件的事件源往往与容器相关,当鼠标进入容器.离开容器,或者在容器中单击鼠标.拖动鼠标时都会发生鼠标事件.java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口. MouseListener接口 MouseListener接口能处理5种鼠标事件:按下鼠标,释放鼠标,点击鼠标.鼠标进入.鼠标退出.相应的方法有:(1) getX():鼠标的X坐标(2) getY():鼠标的Y坐标(3) getModifiers():获取鼠标的左键或右键.(4

Java知多少(94)键盘事件

键盘事件的事件源一般丐组件相关,当一个组件处于激活状态时,按下.释放或敲击键盘上的某个键时就会发生键盘事件.键盘事件的接口是KeyListener,注册键盘事件监视器的方法是addKeyListener(监视器).实现KeyListener接口有3个: keyPressed(KeyEvent e):键盘上某个键被按下: keyReleased(KeyEvent e):键盘上某个键被按下,又释放: keyTyped(KeyEvent e):keyPressed和keyReleased两个方法的组合

Java Swing界面编程(25)---事件处理:鼠标事件及监听处理

如果想对一个鼠标的操作进行监听,如果鼠标按下.松开等,则可以使用MouseListener接口. package com.beyole.util; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import

java语言gui编程之内部类和鼠标事件经典1

/*  时间:2015年3月21日09:53:44  程序目的:理解内部类的作用和鼠标事件的处理  源文件的名称:TestInner.java  要点:   1, 内部类的性质和用法   2, 将内部类定义为普通内部类的好处-----内部类可以直接访问外层类的属性和方法   3, 可以更清楚的组织逻辑,防止不应该被其他类访问的类进行访问      何时使用:    该类不允许或不需要其他类进行访问.       鼠标事件     鼠标事件的两个监听器接口为MouseListener, Mouse

Java:在不同界面样式下JPopupMenu与鼠标事件mousePressed表现的结果不同!

今天遇到一个郁闷的事儿: 在一个JFrame上放了一个JList元件,这个JList元件添加了鼠标事件: mouseReleased.mousePressed ... 其中,在mouseReleased中,主要显示一个弹出式菜单.在mousePressed 中输入用户按下的是左键还是右键. 但我发现一个奇怪的事情, 当我把当前界面设置为:UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel&quo

Java知多少(完结篇)

Java知多少(1)语言概述 Java知多少(2)虚拟机(JVM)以及跨平台原理 Java知多少(3) 就业方向 Java知多少(4)J2SE.J2EE.J2ME的区别 Java知多少(5) Java开发环境的搭建 Java知多少(6)第一个程序示例 Java知多少(7)类与对象 Java知多少(8)类库及其组织结构 Java知多少(9) import及Java类的搜索路径 Java知多少(10)数据类型及变量 Java知多少(11)数据类型转换 Java知多少(12)运算符 Java知多少(1

Java知多少(110)数据库之插入记录

插入数据表记录有3种方案 一.使用Statement对象 实现插入数据表记录的SQL语句的语法是: insert into 表名(字段名1,字段名2,……)value (字段值1,字段值2,……) 例如: insert into ksInfo(考号,姓名,成绩,地址,简历)value(‘200701’,’张大卫’534,’上海欧阳路218弄4-1202’,’’) 实现同样功能的Java程序代码是: sql = “insert intoksIno(考号,姓名,成绩,地址,简历)”; sql= =

Java知多少(97)框架窗口基础

窗口是GUI编程的基础,小应用程序或图形界面的应用程序的可视组件都放在窗口中,在GUI中,窗口是用户屏幕的一部分,起着在屏幕中一个小屏幕的作用.有以下三种窗口: Applet窗口:Applet类管理这个窗口,当应用程序程序启动时,由系统创建和处理: 框架窗口(JFrame):这是通常意义上的窗口,它支持窗口周边的框架.标题栏,以及最小化.最大化和关闭按钮: 一种无边框窗口(JWindow):没有标题栏,没有框架,只是一个空的矩形. 用Swing中的JFrame类或它的子类创建的对象就是JFram