本帖最后由 tesonic 于 2009-09-08 11:26:54 编辑

解决方案 »

  1.   

    只能往右下移动可能是因为你的方块坐标始终在加一个正数1 鼠标左键按住的时候,获取鼠标坐标(mx0, my0)
    2 鼠标左键按住的时候,获取方块原点坐标(rx0, ry0)
    3 拖拽时即时获得鼠标当前坐标(mx1, my1)
    4 拖拽时用鼠标即时坐标减去原始坐标获得差值(offsetX = mx1 - mx0, offsetY = my1 - my0)
    5 方块原点坐标加上鼠标坐标差值(rx0 + offsetX, ry0 + offsetY)鼠标移动事件可以使用 MouseMotionAdapter.mouseDragged(MouseEvent e), 判断鼠标是否在方块内可以用MouseAdapter.mouseEntered(MouseEvent e)和MouseAdapter.mouseExited(MouseEvent e)
      

  2.   

    使用MouseAdapter.mouseEntered的前提是你的方块是一个独立Object,在这个类里定义鼠标进入和离开事件
      

  3.   

    你问的是j2se还是j2ee的?swing还是js?
      

  4.   

    不好意思,我得问的详细一点儿哈
    首先,在mouseDragged这个方法里,我怎么去确认鼠标点击的点呢?(mouseEvent)e.getPoint()取得的是我移动时的任意一点吧。
    还有,我拖动这个矩形,是不是还需要重新画矩形呢,用draw的这个方法repaint()呢?
      

  5.   

    如果是我的话,我会建立一个方块的class,继承JComponent,在里面的paintComponent(Graphics)方法里绘制这个方块,这样你就不用在拖拽鼠标的时候还要顾及绘画方块。把这个方块放到一个继承JPanel的类里。在JPanel里用MouseAdaptermousePressed(MouseEvent e)的e.getX()和e.getY()来得到鼠标坐标。这个坐标应该是鼠标和JPanel原点的相对坐标(还可以得到鼠标和屏幕原点的绝对坐标)。得到鼠标坐标后再得到方块相对于JPanel的坐标。在MoseMotionAdapter.mouseDragged(MouseEvent e)里再用e.getX()和e.getY()的时候,是即时的得到鼠标拖拽过程中的坐标,你需要用来减去刚才获得的那个鼠标初始坐标来获得差值,从而改变方块坐标达到移动的目的。在mouseDragged这个方法里,最后一行应该是JPanel.repain()
      

  6.   

    说那么多,还是上代码吧MyPanel.javaimport java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;public class MyPanel extends JPanel{

    MySquare ms = new MySquare();

    Die die = new Die();

    private int oX = 0; //每次鼠标按下的时候得到鼠标的初始坐标

    private int oY = 0; //每次鼠标按下的时候得到鼠标的初始坐标

    private int xx = 0; //每次鼠标按下的时候得到方块的初始坐标

    private int yy = 0; //每次鼠标按下的时候得到方块的初始坐标

    /** test **/
    public static void main(String args[]) {
    try{
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setBounds(10, 10, 800, 600);


    MyPanel panel = new MyPanel();

    frame.add(panel);
    frame.setVisible(true);

    } catch(Exception ex) {
    ex.printStackTrace();
    }
    } public MyPanel() {
    try{
    initComp();
    } catch(Exception ex) {
    ex.printStackTrace();
    }
    }

    public void initComp() throws Exception {
    this.setBorder(BorderFactory.createBevelBorder(1));

    //在方块上添加事件监听
    ms.addMouseListener(new square_mouseAdapter(this));
    ms.addMouseMotionListener(new square_mouseMotionAdapter(this));
    this.add(ms);
    }

    /*** Action Handler ***/
    public void square_mousePressed(MouseEvent e) {

    //得到左键按下的时候鼠标所在位置
    int x= e.getX();
    int y = e.getY();

    Point p = new Point(x, y);

    //转化成相对屏幕的坐标
    SwingUtilities.convertPointToScreen(p, ms);

    System.out.println("Original coordinates: [" + x + ", " + y + "]\tAfter conversion:[" + p.getX() + ", " + p.getY() + "]");

    //每次鼠标按下的时候得到鼠标的初始坐标
    oX = (int)p.getX();
    oY = (int)p.getY();

    //每次鼠标按下的时候得到方块的初始坐标
    xx = ms.getX();
    yy = ms.getY();

    System.out.println("Square original position: [" + xx + ", " + yy + "]");
    }

    public void square_mouseDragged(MouseEvent e) {
    //拖拽过程中鼠标坐标
    int x= e.getX();
    int y = e.getY();

    Point p = new Point(x, y);

    //转化成相对屏幕的坐标
    SwingUtilities.convertPointToScreen(p, ms);

    System.out.println("Dragging coordinates: [" + x + ", " + y + "]\tAfter conversion:[" + p.getX() + ", " + p.getY() + "]");

    //获取目前鼠标位置和初始位置的差
    int offsetX = (int)p.getX() - oX;
    int offsetY = (int)p.getY() - oY;

    System.out.println("Offset: [" + offsetX + ", " + offsetY + "]");

    //改变方块坐标
    ms.setBounds(xx + offsetX, yy + offsetY, ms.getWidth(), ms.getHeight());

    this.repaint();
    }
    }/*
     * 鼠标事件
     */
    class square_mouseAdapter extends MouseAdapter {
    MyPanel adaptee;

    public square_mouseAdapter(MyPanel adaptee) {
    this.adaptee = adaptee;
    }

    public void mousePressed(MouseEvent e) {
    adaptee.square_mousePressed(e);
    }
    }class square_mouseMotionAdapter extends MouseMotionAdapter{
    MyPanel adaptee;

    public square_mouseMotionAdapter(MyPanel adaptee) {
    this.adaptee = adaptee;
    }

    public void mouseDragged(MouseEvent e) {
    adaptee.square_mouseDragged(e);
    }
    }
    MySquare.javaimport java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;import javax.swing.JPanel;// 方块
    public class MySquare extends JPanel{

    public MySquare() {
    this.setPreferredSize(new Dimension(70, 70));
    }

    /**
     * 画方块
     */
    @Override 
    public void paintComponent(Graphics g) {
            int w = getWidth();
            int h = getHeight();
            
            
            Graphics2D g2 = (Graphics2D)g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
                    g2.setColor(Color.GREEN);
            g2.fillRect(0, 0, w, h);
            g2.setColor(Color.BLACK);
            
            g2.drawRect(0, 0, w-1, h-1);
        }
    }