2024年6月18日发(作者:)
鼠标监听器
鼠标监听器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上的坐标,并拖曳出直线来。
import .*;
import .*;
import .*;
/*为了达到画线的功能,我们分别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();
seListener(this);
seMotionListener(this);
setSize(300,300);
show();
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
(0);
}
}
);
}
/*由mousePressed(),mouseReleased()取得示拖曳的开始与结束坐标*/
public void mousePressed(MouseEvent e){
startx=();
starty=();
}
public void mouseReleased(MouseEvent e){
endx=();
endy=();
}
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=();
y=();
repaint();
}
public void mouseDragged(MouseEvent e){
flag=2;
x=();
y=();
repaint();
}
public void update(Graphics g){
or(kground());
ct(0,0,getWidth(),getHeight());
paint(g);
}
public void paint(Graphics g){
or();
if (flag==1){
ring("鼠标坐标:("+x+","+y+";)",10,50);
ne(startx,starty,endx,endy);
}
if (flag==2){
ring("拖曳鼠标价坐标:("+x+","+y+";)",10,50);
ne(startx,starty,x,y);
}
}
public static void main(String[] args){
new MouseDemo3();
}
}
例3
实现一个简单的鼠标控制程序MouseController。程序功能很简单:随机移动鼠
标并点击左键。
代码如下:
import eption;
import ion;
import ;
import t;
import vent;
import ;
/**
*
*/
/**
* @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 = aultToolkit().getScreenSize();
rand = new Random();
try {
robot = new Robot();
} catch (AWTException ex) {
tackTrace();
}
}
public void run() {
while(!stop) {
int x = t();
int y = t();
ove(x, y);
ress(1_MASK);
try {
(2000);
} catch (InterruptedException ex) {
tackTrace();
}
}
}
public synchronized void stop() {
stop = true;
}
public static void main(String[] args) {
MouseController mc = new MouseController();
Thre
$False$
ad mcThread = new Thread(mc);
n("Mouse Controller start");
();
try {
(60000);
} catch (InterruptedException ex) {
tackTrace();
}
();
n("Mouse Controller stoped");
}
}
例4 本例程演示鼠标监听器,鼠标点击和运动的监听。
///
//
import .*;
import .*;
import .*;
class MyPanel extends JPanel implements MouseMotionListener{
public MyPanel() {
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
if (ckCount() >= 2)
n("n双击鼠标");
int x = (); int y = ();
n("点击鼠标的位置nX:" + x + "ty: " +
y);
}
});
addMouseMotionListener(this);
}
public void mouseMoved(MouseEvent evt){
n("n鼠标正在移动");
}
public void mouseDragged(MouseEvent evt){
n("n鼠标正在拖动");
}
}
class MyFrame extends JFrame{
public MyFrame(){
setTitle("鼠标事件示例程序");
setSize(300, 200);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
(0);
}
} );
Container contentPane = getContentPane();
(new MyPanel());
}
}
public class MouseEvt{
public static void main(String[] args){
JFrame frame = new MyFrame();
ible(true);
}
}
///
简要说明
在MyPanel的构建器中添加了鼠标适配器来监听鼠标点击数和位置。也添加了运
动监听器来处理移动和拖放操作。
鼠标双击事件
鼠标的单双击事件在很多时候对我们帮助很大,但是在JAVA中却没有给出鼠标双击事件.我
们可以通过事件源ckCount()==2来判断鼠标点击次数来实现鼠标双击事件,例如:
public class MyMouseListener
extends dapter ...{
public void mouseClicked(MouseEvent e) ...{
n("clicked");
int clickTimes = ckCount();
if (clickTimes == 2) ...{
n("Doublc Clicked!");
}
}
}
但是这样并没有达到我们的要求,因为在每次触发双击事件的同时会触发单击事件.所
以我们试图改进以上方案,不使用系统提供的ckCount()方法.可以考虑当第一次单击
鼠标的时候让鼠标单击事件延时0.2秒执行,而在这段时间里等待第二次单击,如果有第二次
单击,那么我们执行双击事件任务,取消单击任务;如果在这段时间没有等到再次单击,那么执
行单击任务.
下面是用定时器延时单击事件实现鼠标双击事件,单击和双击事件互不影响!
public class MyMouseListener
extends dapter ...{
private static boolean flag=false;//用来判断是否已经执行双击事件
private static int clickNum=0;//用来判断是否该执行双击事件
public void mouseClicked(MouseEvent e) ...{
final MouseEvent me=e;//事件源
=false;//每次点击鼠标初始化双击事件执行标志为false
if (um == 1) ...{//当clickNum==1时执行双击事件
oubleClicked(me);//执行双击事件
um=0;//初始化双击事件执行标志为0
=true;//双击事件已执行,事件标志为true
return;
}
//定义定时器
timer=new ();
//定时器开始执行,延时0.2秒后确定是否执行单击事件
le(new ask() ...{
private int n=0;//记录定时器执行次数
public void run() ...{
if()...{//如果双击事件已经执行,那么直接取消单击执行
n=0;
um=0;
();
return;
}
if (n == 1) ...{//定时器等待0.2秒后,双击事件仍未发生,执行单击事件
mouseSingleClicked(me);//执行单击事件
= true;
um=0;
n=0;
();
return;
}
clickNum++;
n++;
}
},new (),500);
}
/** *//**
* 鼠标单击事件
* @param e 事件源参数
*/
public void mouseSingleClicked(MouseEvent e)...{
n("Single Clicked!");
}
/** *//**
* 鼠标双击事件
* @param e 事件源参数
*/
public void mouseDoubleClicked(MouseEvent e)...{
n("Doublc Clicked!");
}
}
//
import .*;
import .*;
import .*;
public class Test extends JFrame{
public Test(){
super("test");
init();
e(800,600);
ible(true);
}
private void init(){
JButton b=new JButton("button");
nds(50,50,100,30);
tentPane().setLayout(null);
tentPane().add(b);
seListener(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_KP_UP
VK_PAUSE
VK_NUMBER0
VK_0
含义
小键盘向上
暂停键
小键盘数字0
数字键0
键码
VK_CONTROL
VK_ATL
VK_SHIFT
VK_F1
VK_B
含义
Ctrl键
Alt键
Shift键
功能键F1
字母键B
VK_LEFT/VK_RIGHT 左右方向键
虚拟键码对应的是键位,不区分大小写。要想知道大小写还必须查看修饰键
(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 本例程演示键盘监听器后键码的用法。
///
//
import .*;
import .*;
import .*;
class MyKeyListener implements KeyListener{
public void keyPressed(KeyEvent evt) {
n("n按键被按下");
showKeyEventMsg(evt);
}
public void keyReleased(KeyEvent evt){ }
public void keyTyped(KeyEvent evt) { }
private void showKeyEventMsg(KeyEvent evt){//显示按键事件信息
//得到按键对应的整型数
int code = Code();
//返回按键事件所代表的字符
char c = Char();
//得到代表按键的字符串
String szText = Text(code);
if (code != _UNDEFINED)
n("n按键对应的整型数:"+code);
if (c != _UNDEFINED)
n("n与按键相联系的字符:"+c);
if (tDown())
n("n按键Shift被按下");
n("n按键本身的字符串:"+szText);
}
}
class ButtonPanel extends JPanel{
public ButtonPanel() {
//新建一个文本域组件
tf = new JTextField(20);
add(tf);
//指定用来处理该按钮事件的监听器对象为JPanel本身
myListener = new MyKeyListener();
Listener(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)
{ (0);
}
});
Container ctPane = getContentPane();
(new ButtonPanel());
}
}
public class KeyEvt{
public static void main(String[] args) {
JFrame frame = new ButtonFrame();
ible(true);
}
}
///简要说明
1. 程序建立了自己的键盘监听器MyKeyListener,定义了一个新方法
showKeyEventMsg用来在标准输出设备上显示有关的键盘信息。
2. 在面版ButtonPanel上建立文本框并加键盘监听器。把面版ButtonPanel
放到窗口ButtonFrame中。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1718695285a2751899.html
评论列表(0条)