| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 600 人关注过本帖
标题:关于鼠标事件的问题
只看楼主 加入收藏
东方一帅
Rank: 2
等 级:论坛游民
帖 子:18
专家分:34
注 册:2010-7-23
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:5 
关于鼠标事件的问题
代码如下:
import java.awt.*;
import java.awt.event.*;
public class Mouse extends Frame
{
    static int x,y,ox,oy,offx,offy,px,py;
    static Mouse frm=new Mouse();
    static Button bu=new Button("拖动我");
    static TextField tf=new TextField(20);
    public static void main(String args[])
    {
        frm.setLayout(null);
        frm.setTitle("鼠标事件的处理");
        frm.setBounds(100,100,400,300);
        bu.setBounds(180,140,60,20);
        tf.setBounds(50,200,260,50);
        tf.setEditable(false);
        frm.add(bu);
        frm.add(tf);
        frm.setVisible(true);
        bu.addMouseListener(new myMouse());
        bu.addMouseMotionListener(new myMouseM());
    }
    static class myMouse extends MouseAdapter
    {
        public void mousePressed(MouseEvent e)
        {
             px=e.getX();
             py=e.getY();
             ox=bu.getLocation().x;
             oy=bu.getLocation().y;
            
        }
    }
    static class myMouseM extends MouseMotionAdapter
    {
        public void mouseDragged(MouseEvent e)
        {
             offx=px-ox;
             offy=py-oy;
             x=e.getX()-offx;
             y=e.getY()-offy;
             tf.setText("命令按钮放置在("+x+","+y+")的位置");
             bu.setLocation(x, y);
            
             ox=x;// 如果不加这两句,拖动时会晃动,为什么?
             oy=y;
            
        }
    }
}
运行后正常,但是觉得上述ox=x;oy=y;这两句多余,但是去掉后拖动时却晃动为什么?这两句有什么作用呢?
搜索更多相关主题的帖子: 鼠标 
2010-08-15 17:33
shellingford
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:19
帖 子:228
专家分:1348
注 册:2010-8-9
收藏
得分:5 
MouseEvent e
中的e.getX()和e.getY(),按照API描述并非获得鼠标移动后的坐标。
“返回事件相对于源组件的水平 x 坐标。”

应该和这个有关,不过没看懂什么意思,对java的界面了解不多。
2010-08-15 22:10
东方一帅
Rank: 2
等 级:论坛游民
帖 子:18
专家分:34
注 册:2010-7-23
收藏
得分:0 
什么意思啊,没看懂。。。。
2010-08-17 08:20
shellingford
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:19
帖 子:228
专家分:1348
注 册:2010-8-9
收藏
得分:0 
控件A,坐标(100,100)
鼠标点击上去,点击坐标(110,110)
而e.getX()获得的是相对于组件的位置,所以得到的不是110,而是10
鼠标将控件从(100,100)移动到(200,200),
而实际上鼠标位置是从(110,110)移动到了(210,210)
当第一次触发mouseDragged时
x=e.getX()-offx;
也就是
x=e.getX()-px+ox;
mouseDragged中的e.getX()=210-100=110
px=110-100=10
ox为最初的控件A的x坐标
e.getX()-px正好是鼠标移动的距离110-10=210-110
所以新的控件x位置是原始控件A的x坐标+鼠标移动的距离。

而mouseDragged事件是持续不断发生的,所以需要将最新的控件A的x坐标赋值给ox
2010-08-17 09:04
lampeter123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:54
帖 子:2508
专家分:6424
注 册:2009-1-30
收藏
得分:5 
程序代码:
import java.awt.*;
import java.awt.event.*;
public class Mouse extends Frame
{
    static int x,y,ox,oy,offx,offy,px,py;
    static Mouse frm=new Mouse();
    static Button bu=new Button("拖动我");
    static TextField tf=new TextField(20);
    public static void main(String args[])
    {
        frm.setLayout(null);
        frm.setTitle("鼠标事件的处理");
        frm.setBounds(100,100,400,300);
        bu.setBounds(180,140,60,20);
        tf.setBounds(50,200,260,50);
        tf.setEditable(false);
        frm.add(bu);
        frm.add(tf);
        frm.setVisible(true);
        bu.addMouseListener(new myMouse());
        bu.addMouseMotionListener(new myMouseM());
    }
    static class myMouse extends MouseAdapter
    {
        public void mousePressed(MouseEvent e)
        {
             px=e.getX();//取得鼠标按下时的X坐标
             py=e.getY();//取得鼠标按下时的Y坐标
             ox=bu.getLocation().x;//取得bu的左边界距窗口左边界的距离
             oy=bu.getLocation().y;//取得bu的上边界距窗口上边界的距离
        }
    }
    static class myMouseM extends MouseMotionAdapter
    {
        public void mouseDragged(MouseEvent e)
        {
             offx=px-ox;//offx为鼠标指针与命令按钮左边界的距离
             offy=py-oy;//offy为鼠标指针与命令按钮上边界的距离
             x=e.getX()-offx;//获得新的位置
             y=e.getY()-offy;
             tf.setText("命令按钮放置在("+x+","+y+")的位置");
             bu.setLocation(x, y);
            
             ox=x;//ox表示拖动结束时bu的左边界距窗口左边界的距离
             oy=y;//oy表示拖动结束时bu的上边界距窗口上边界的距离 

           
        }
    }
}

你的优秀和我的人生无关!!!!
    
    我要过的,是属于我自己的生活~~~
2010-08-17 09:05
东方一帅
Rank: 2
等 级:论坛游民
帖 子:18
专家分:34
注 册:2010-7-23
收藏
得分:0 
哦,明白了,px是不断改变的,所以要让ox同步改变才能保证offx不变,5楼说的不对吧,ox应该是拖动中bu左边界的距离,通过ox=x;来与px的不断改变同步。。。。
2010-08-17 12:14
快速回复:关于鼠标事件的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045598 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved