第 7章 Java中的鼠标事件与键盘事件
7.1 鼠 标 事 件
7.2 处理鼠标输入
7.3 键 盘
7.1 鼠 标 事 件
7.1.1 MouseListener接口鼠标监听接口 ( MouseListener) 用于监听发生在一个 GUI构件上的鼠标事件,
包括鼠标的按下,释放,单击,进入和退出 。 Java同时也提供了与该接口相对应的称作事件剪裁器的抽象类 MouseAdapter。
在一个实现了 MouseListener接口或继承了 MouseAdapter类的类中可以定义事件的处理方法,而该类的一个对象则应该用
addMouseListener()方法注册到发生鼠标事件的构件上。
MouseListener接口包含的方法如下。
( 1 ) public void mouseClicked
( MouseEvent节 e) 当在一个构件上单击鼠标时被调用 。
( 2 ) public void mousePressed
( MouseEvent e) 当在一个构件上按下鼠标按钮时被调用 。
( 3 ) public void mouseReleased
( MouseEvent e) 当在一个构件上释放鼠标按钮时被调用 。
( 4 ) public void mouseEntered
( MouseEvent e) 当鼠标指针进入构件时被调用 。
( 5 ) public void mouseExited
( MouseEvent e) 当鼠标指针退出构件时被调用 。
7,1,2
MouseMoutionListener接口鼠标移动监听接口
( MouseMoutionListener) 用于监听发生在一个 GUI构件上的鼠标移动事件,包括鼠标的移动和拖动,其 使 用 方 法 与
MouseListener接口相同 。 它所包含的方法如下 。
( 1 ) public void mouseDragged
( MouseEvent e) 当在一个构件上按下鼠标按钮并且拖动鼠标时该方法被调用 。 鼠标拖动事件持续到鼠标按钮被释放时为止,
而不管鼠标的位置是否超出了原来构件的边界 。
( 2 ) public void mouseMoved
( MouseEvent e) 当鼠标指针移动时该方法被调用,注意此时鼠标的按钮并没有被按下 。
在 MouseListener 接口和
MouseMotionListener接口中的所有方法中都有一个参数,它是鼠标事件类
MouseEvent的一个对象,当鼠标事件发生时,系统自动生成一个该类的对象,在鼠标事件的处理方法中,经常需在调用该类的方法来获得关于事件的一些信息 。
MouseEvent类的常用方法如下 。
( 1) public int getX() 返回当前鼠标指针位置的 x坐标值。
( 2) public int getY() 返回当前鼠标指针位置的 y坐标值。
( 3) public int getClickCount() 返回事件中鼠标的点击次数。
( 4) public String paramString() 返回一个标识该事件的字符串。
7.2 处理鼠标输入例 7-1:设计一个处理鼠标输入的程序,
使得在一个画布构件上拖动鼠标时能画出一段曲线。
设计思路:我们假定每当按下鼠标按钮时开始画线,然后拖动鼠标继续画线过程,释放鼠标时表示一段曲线的画线过程结束,程序允许在画布构件上画出多段曲线。
一段曲线实际上由许多小的直线段构成,因此我们只需记录按下鼠标按钮时的坐标点,拖动鼠标时所产生的所有坐标点及释放鼠标时的坐标点,然后在这些坐标点之间顺序地画出直线段即连成一段曲线 。
为了保存这些坐标点,我们使用了一个
Polygon对象 poly,它是由 Java系统提供的一个类,可以保存多边形的各个顶点坐标并可以动态地加入新的坐标点 。
在各段不同的曲线之间加入一个特殊的标志点 ( - 1,- 1) 以便在 paint()方法中画线时确定一条新的曲线段的起点 。 所有坐标点的记录及保存都是在鼠标事件接口的 mousePressed()方法,mouseReleased()
方法及鼠标移动事件接口中的
mouseDragged()方法中完成的 。 在 paint()
方法中根据所记录的坐标点画出各个曲线段 。
import java.awt.event.*;
import java.awt.*;
public class mouse extends Frame
implements ActionListener{
Button butn=new Button("手画线状态 ");
canvas1 can=new canvas1();
public static void main(String[] args) {
new mouse();
}
mouse(){
Frame win1=new Frame();
win1.setLayout(new
BorderLayout(0,0));
win1.addWindowListener(new
WindowAdapter(){
public void windowClosing(WindowEvent
e) {
System.exit(0);}});
win1.add(butn,BorderLayout.NORTH);
butn.addActionListener(this);
can.setSize(350,200);
can.setBackground(Color.green);
win1.add(can,BorderLayout.CENTER);
win1.setTitle("用鼠标画直线 ");
win1.setSize(400,200);
win1.setVisible(true);
}
public void
actionPerformed(ActionEvent e){
if(e.getSource()==butn)
can.mode=1;//设置画线状态
}
}
class canvas1 extends Canvas implements
MouseListener,MouseMotionListener{
int mode=0;//方式变量,初始值为非画线状态
Polygon poly=new Polygon();//用类
Polygon的对象来存储画线时点的坐标
canvas1(){
addMouseListener(this);//注册鼠标事件
addMouseMotionListener(this);//注册鼠标移动事件
}
public void paint(Graphics g) {
g.setColor(Color.blue);//设置画笔颜色
if(mode==1&&poly.npoints>1)//用坐标点画出曲线的方法
for(int i=0;i<poly.npoints-1;i++){
if (poly.xpoints[i+1]==-1){
i++;
continue;
}
else
g.drawLine(poly.xpoints[i],poly.ypoints[i],p
oly.xpoints[i+1],poly.ypoints[i+1]);
}
}
public void mouseClicked(MouseEvent
e){}
public void mousePressed(MouseEvent e){//
按下鼠标按钮时记录坐标起点
poly.addPoint(e.getX(),e.getY());
}
public void mouseReleased(MouseEvent
e){//释放鼠标记录坐标点
poly.addPoint(e.getX(),e.getY());//加入手画线的终点坐标
poly.addPoint(-1,-1);//加入一个特殊的标记点它标志曲线的结束
repaint();//重画曲线
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseMoved(MouseEvent
e){}
public void mouseDragged(MouseEvent
e){//拖动鼠标时加入坐标点并重画曲线
poly.addPoint(e.getX(),e.getY());
repaint();
}
}
运行结果见图 7-1。
图 7-1
7.3 键 盘
7.3.1 键盘事件在 Java中与键盘事件有关的接口和类主要有 KeyListener,KeyAdapter 及
KeyEvent。 其中 KeyListener 和
KeyAdapter用于监听键盘事件的发生并将其传送到相应的事件处理方法中去,而
KeyEvent主要用于提供事件发生时的有关信息 。
KeyListener接口能够监听的键盘事件有 3种:键按下( Pressed),键释放
( Released) 及键的按下并释放( Typed),
相应的事件处理方法如下。
( 1) public void keyTyped(KeyEvent
e) 当键盘上的一个键被按下并释放后该方法被调用。
( 2 ) public void
keyPressed(KeyEvent e) 当键盘上的一个键盘被按下后该方法被调用 。
( 3 ) public void
keyReleased(KeyEvent e) 当键盘上的一个键盘被释放时该方法被调用 。
KeyEvent类中常用的方法如下。
( 1) public int getKeyCode() 返回键盘事件中相关键的整数类型键码。
( 2) public char getKeyChar() 返回键盘事件中相关键的字符类型键码。例如,
对于 Shift+a键返回的字符是 A。
( 3) public static String
getKeyText(int keyCode) 返回一个描述由参数 int keyCode指定的键的字符串,如
"HOME","F1" 或 "A".等 。
( 4) public String paramString() 返回一个标识该事件的参数字符串 。
7.3.2 处理键盘输入例 7-2:处理键盘输入的例子。在该例子中,创建了一个文本框和 4个文本区,文本框用来接受键盘的输入并注册了键盘事件监听者。在前 3个文本区中分别显示在
Pressed,Released,Typed方法中相关联的键所对应的字符,
比如如果按下的键是,a”则显示,a”,
而如果是一些功能键如,HOME”则没有相对应的键符可以显示,此时我们用
e.getKeyText( e.getKeyCode()) 在第 4 个文本区中显示该功能键对应的描述性字符串,如 Home,Left,F1,End等 。
import java.awt.event.*;
import java.awt.*;
public class key implements KeyListener{
TextField tx = new TextField(20);
TextArea ta1 = new TextArea("显示按下的键,\n",7,20);
TextArea ta2 = new TextArea("显示释放的键,\n",7,20);
TextArea ta3 = new TextArea("显示控制与功能键,\n",7,20);
TextArea ta4 = new TextArea(null,2,20);
public void keyTyped(KeyEvent e) {
ta4.append(String.valueOf(e.getKeyChar())
);
}
public void keyPressed(KeyEvent e) {
ta1.append(String.valueOf(e.getKeyChar())
);
//ta1.append(String.valueOf(e.getKeyCode(
)));
ta3.append(e.getKeyText(e.getKeyCode())+
"\n");
}
public void keyReleased(KeyEvent e) {
ta2.append(String.valueOf(e.getKeyChar())
);
}
key(){
Frame win1 = new Frame("Key event
应用 ");
win1.addWindowListener(new
WindowAdapter(){
public void
windowClosing(WindowEvent e) {
System.exit(0);}});
win1.setLayout(new FlowLayout());
Panel p1 = new Panel();
win1.add(p1);
p1.add(new Label("请在此编辑框内键入字符,"));
p1.add(tx);
tx.addKeyListener(this);
Panel p2 = new Panel();
win1.add(p2);
p2.add(ta1);
p2.add(ta2);
p2.add(ta3);
Panel p3 = new Panel();
win1.add(p3);
p3.add(new Label("显示按下并释放的键盘,"));
p3.add(ta4);
win1.setSize(500,280);
win1.setVisible(true);
}
public static void main(String[] args) {
new key();
}
}
运行结果见图 7-2。
图 7-2