2018年3月计算机二级考试JAVA入门知识点:鼠标事件

Python014

2018年3月计算机二级考试JAVA入门知识点:鼠标事件,第1张

2018年3月计算机二级考试JAVA入门知识点:鼠标事件

鼠标事件事件源往往与容器相关,当鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。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】小应用程序设置了一个文本区,用于记录一系列鼠标事件。当鼠标进入小应用程序窗口时,文本区显示“鼠标进来”当鼠标离开 窗口时,文本区显示“鼠标走开”当鼠标被按下时,文本区显示“鼠标按下”,当鼠标被双击时,文本区显示“鼠标双击”并显示鼠标的坐标。程序还显示一个红色的圆,当点击鼠标时,圆的半径会不断地变大(查看源文件)。

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

JButton button

public void init(){

button = new JButton(“按钮也能发生鼠标事件”)

r = 10

text = new JTextArea(15,20)

add(button)

add(text)

button.addMouseListener(this)

}

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

e.getModifiers()==InputEvent. BUTTON3_MASK

MouseMotionListener接口

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

注册监视器的方法是:

addMouseMotionListener(监视器)

要实现的的接口方法有两个:

(1) mouseDragged(MouseEvent e)

(2) mouseMoved(MouseEvent e)

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

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

class MyWindow extends JFrame{

public MyWindow(String s){

super(s)

Container con = this.getContentPane()

con.setLayout(new BorderLayout())

this.setLocaltion(100,100)

MyListener listener = new MyListener()

listener.setPreferredSize(new Dimension(700,700))

JScrollPane scrolledCanvas = new JScrollPane(listener)

this.add(scrolledCanvas,BorderLayout.CENTER)

this.setVisible(true)

this.pack()

}

public Dimension getPreferredSize(){

return new Dimension(400,400)

}

}

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

//利用 java.awt.Robot 类来自动完成一些键盘或鼠标的动作,下面是一个小例子

//程序流程:模拟鼠标左键点击 开始-->运行-->CMD-->DIR-->CLS-->EXIT

//模拟右键点击 移动到右下角-->右键点击-->调整日期和时间-->退出

import java.awt.*

import java.awt.event.*

import javax.swing.JOptionPane

//Test.java

public class Test {

public static void main(String[] args) throws Exception {

final Robot rb = new Robot()

new Thread(){

public void run(){

rb.delay(2000)

//回车

rb.keyPress(KeyEvent.VK_ENTER)

rb.keyRelease(KeyEvent.VK_ENTER)

}

}.start()

JOptionPane.showMessageDialog(null,"以下程序自动执行,包括本对话框,请不必进行人为干预.\n如果不能正常执行程序,请先关闭输入法")

//设置开始菜单的大概位置

int x = 40

int y = Toolkit.getDefaultToolkit().getScreenSize().height-10

//鼠标移动到开始菜单,

rb.mouseMove(x,y)

rb.delay(500)

//单击三次开始菜单

for(int i=0i<3i++)

pressMouse(rb,InputEvent.BUTTON1_MASK,500)

rb.delay(1000)

//运行CMD命令 r cmd enter

int[] ks = {KeyEvent.VK_R,KeyEvent.VK_C,KeyEvent.VK_M,KeyEvent.VK_D,KeyEvent.VK_ENTER,}

pressKeys(rb,ks,500)

rb.mouseMove(400,400)

rb.delay(500)

//运行DIR命令 dir enter

ks = new int[]{KeyEvent.VK_D,KeyEvent.VK_I,KeyEvent.VK_R,KeyEvent.VK_ENTER}

pressKeys(rb,ks,500)

rb.delay(1000)

//运行CLS命令 cls enter

ks = new int[]{KeyEvent.VK_C,KeyEvent.VK_L,KeyEvent.VK_S,KeyEvent.VK_ENTER}

pressKeys(rb,ks,500)

rb.delay(1000)

//运行EXIT命令 exit enter

ks = new int[]{KeyEvent.VK_E,KeyEvent.VK_X,KeyEvent.VK_I,KeyEvent.VK_T,KeyEvent.VK_ENTER}

pressKeys(rb,ks,500)

rb.delay(1000)

//右键测试

x=Toolkit.getDefaultToolkit().getScreenSize().width-10

rb.mouseMove(x, y)

//如果是双键鼠标,请改用InputEvent.BUTTON2_MASK试试,我没有这种鼠标

pressMouse(rb,InputEvent.BUTTON3_MASK,500)

//显示日期调整对话框 a

pressKeys(rb,new int[]{KeyEvent.VK_A},1000)

rb.delay(2000)

pressKeys(rb,new int[]{KeyEvent.VK_ESCAPE},0)

rb.delay(1000)

new Thread(){

public void run(){

rb.delay(1000)

//回车

rb.keyPress(KeyEvent.VK_ENTER)

rb.keyRelease(KeyEvent.VK_ENTER)

}

}.start()

JOptionPane.showMessageDialog(null,"演示完毕!")

}

//鼠标单击,要双击就连续调用

private static void pressMouse(Robot r,int m,int delay){

r.mousePress(m)

r.delay(10)

r.mouseRelease(m)

r.delay(delay)

}

//键盘输入

private static void pressKeys(Robot r,int[] ks,int delay){

for(int i=0i<ks.lengthi++){

r.keyPress(ks[i])

r.delay(10)

r.keyRelease(ks[i])

r.delay(delay)

}

}

}