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)
}
}
}