日期:2014-05-20  浏览次数:20718 次

请教一个鼠标拖动Swing控件的问题
关于鼠标拖动控件的源程序我已经写出来了,但是发现在拖动的过程中鼠标与控件的相对位置总是不能和按下鼠标时的相对位置保持一致,效果很难看,我找了半天找不出问题出在什么地方,现把程序发上来让大家看看是啥问题。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
 *
 * @author Administrator
 */
public class DragTest
{
    final Point pointOffset=new Point(0,0);
    final JLabel label=new JLabel("123456789");
    final int WIDTH=600;
    final int HEIGHT=350;
    public static void main(String[] args)
    {
        new DragTest();
    }
    DragTest()
    {
        initComponent();
    }
    void initComponent()
    {
        JFrame frame=new JFrame();
        frame.setSize(WIDTH,HEIGHT);
        frame.setLocation(SetCenterFrame.getCenterLocationOfFrame(WIDTH, HEIGHT));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane=frame.getContentPane();
        contentPane.add(label);
        frame.setVisible(true);
        
        label.addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                pointOffset.x=e.getX();//记录下鼠标按下时鼠标相对于将要拖动组件的x值
                pointOffset.y=e.getY();//同上
            }
        });
        label.addMouseMotionListener(new MouseMotionAdapter()
        {
            public void mouseDragged(MouseEvent e)
            {
                Component c=e.getComponent();
                Point p=e.getPoint();
                SwingUtilities.convertPointToScreen(p, c);//将鼠标释放时相对于拖动组件的x,y转换成相对于屏幕的x,y
                label.setLocation(p.x-pointOffset.x,     
                                  p.y-pointOffset.y);  /*拖动组件的位置随鼠标移动,
                                                        *具体值等于鼠标相对于屏幕的位置减去鼠标按下时相对于组件的偏移量
                                                        */                                                                     
            }
        });
    }
}

------解决方案--------------------
这个其实很简单的
将鼠标释放时相对于拖动组件的x,y转换成相对于屏幕的x,y,这里有没有转换对,
我的拖动里面setLocation(e.getXOnScreen()-(int)p1_p.getX(),e.getYOnScreen()-(int)p1_p.getY());
就不用转换,直接减去按下是的坐标
你还要注意你窗体有没有眉头,那个坐标要考虑的