小弟是菜鸟,自学java,现在有个问题一直解决不了,求各位高手帮助!我已经画好了一个矩形,如何能实现用鼠标拖动到面板上的任意位置呢? 
import java.awt.*; 
import java.awt.event.*; 
public class JX extends Frame { 
public void paint(Graphics g){ 
g.drawRect(50,50,100,100); 

public static void main (String[] args) { 
JX p = new JX(); 
p.setSize(400,400); 
p.setVisible(true); 
p.addWindowListener(new WindowAdapter(){ 
@Override 
    public void windowClosing(WindowEvent e){ 
System.exit(0); 

}); 

}

解决方案 »

  1.   

    这是我写的,可以实现任意拖放,不知道符不符合楼主的意思import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.awt.geom.*;
    import javax.swing.*;
    /**
     *
     * @author KILLer
     */
    public class DragRectangle extends JComponent {
        private Rectangle2D rect=new Rectangle2D.Double(50,50,100,100);
        boolean needDrag=false;
        public DragRectangle(){
           addMouseListener(new MouseHandler());
           addMouseMotionListener(new MouseMotionHandler());
        }
        public static void main(String[] args){
            JFrame f=new JFrame();
            f.add(new DragRectangle());
            f.setVisible(true);
            f.setSize(300, 400);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        @Override
        public void paintComponent(Graphics g)
       {
          Graphics2D g2 = (Graphics2D) g;
          g2.draw(rect);
       }
        private class MouseHandler extends MouseAdapter
        {
           @Override
           public void mousePressed(MouseEvent event)
           {
               if(rect.contains(event.getPoint()))
                   needDrag=true;
               else
                   needDrag=false;
           }
        }    private class MouseMotionHandler implements MouseMotionListener
        {
           public void mouseMoved(MouseEvent event)
           {
           }
           public void mouseDragged(MouseEvent event)
           {
              if (needDrag)
              {
                 int x = event.getX();
                 int y = event.getY();
                 rect.setFrame(x-rect.getWidth()/2, y - rect.getHeight() / 2, rect.getWidth(), rect.getHeight());
                 repaint();
              }
           }
        }
    }
      

  2.   

    程序中,needDrag是标识是否需要拖拽矩形的标志位。如果点击矩形内部needDrag为true,否则为false。
    只要needDrag为true时,才执行mouseDragged方法中的内容。
      

  3.   

    谢谢大哥的指点,这个效果就是我想要的。不过我把我的程序改了下 如下
    import java.awt.*;
    import java.awt.event.*;
    public class JX  {
    public static void main (String[] args) {
    TFrame t = new TFrame();
         }
    }   class TFrame extends Frame{
         static int x = 50;
     static int y = 50;
     
     TFrame(){
       setLayout(null); 
             setSize(500,500);
             addMouseListener(new MouseAdapter() {public void mousePressed(MouseEvent e) { 
                                    int xstart = e.getX();                    
                                    int ystart = e.getY(); 
                                      x = xstart;
                                       y = ystart;
                                      repaint();       
                                     } 
                                                     
                                  });   
           /* addMouseMotionListener(new MouseMotionAdapter(){
              public void mouseDrag(MouseEvent e){
              int xstart = e.getX();
              int ystart = e.getY();
                  x = xstart;
                  y = ystart;
                  repaint();
              }
             });*/
     
     addWindowListener(new WindowAdapter() { 
             public void windowClosing(WindowEvent e) { 
               System.exit(0); 
          } 
          }); 
         setVisible(true);
     } 
     
         public void paint(Graphics g) { 
         g.drawRect(x ,y ,100,100);
         } 
    }
    现在能实现我的鼠标点到那里,图形就移动到那里。不能拖拽,我想用加注释的这段代码,可问题是取不到鼠标坐标x、y的值。
    int xstart = e.getX();
    int ystart = e.getY();
    x = xstart;
    y = ystart;
    这怎么解决?是不是方法用错了?
      

  4.   


    要实现什么功能?
    我不太明白你的需求。
    而且,为什么要int xstart = e.getX(); 
    int ystart = e.getY(); 
    x = xstart; 
    y = ystart; //这不就成了吗
    x= e.getX(); 
    y= e.getY(); 
      

  5.   

    楼主以后细心一点
    MouseMotionAdapter的方法是mouseDragged,而不是mouseDrag。我看了半天才发现。汗啊~~~
    这下应该没问题了吧!?
      

  6.   

    知道了  哎 粗心啊 我之所以定义int xstart 之类的可能是跟我的编的程序有关 不好意思 没说清楚。 总之 谢谢大哥了
      

  7.   

    还想请教下:你写的程序里
    public void mousePressed(MouseEvent event)
           {
               if(rect.contains(event.getPoint()))
                   needDrag=true;
               else
                   needDrag=false;
           }
        }这个事说如果我的鼠标在矩形区域里才允许拖动;我这个怎么改才能实现你所说的功能import java.awt.*;
    import java.awt.event.*;
    public class JX  {
    public static void main (String[] args) {
    TFrame t = new TFrame();
         }
    } class TFrame extends Frame {
         boolean needDrag = false;
         static int x = 50;
     static int y = 50;
     
     TFrame(){
       setLayout(null); 
             setSize(500,500);
             addMouseListener(new MouseAdapter() {public void mousePressed(MouseEvent e) {
                                    int xpoint = e.getX();                    
                                    int ypoint = e.getY(); 
                               if((xpoint>=50&xpoint<=150)&(ypoint>=50&ypoint<=150))                                                    needDrag = true;
                               else 
                                 needDrag = false;             
                             }  
                            });  
                              
           addMouseMotionListener(new MouseMotionAdapter(){
              public void mouseDragged(MouseEvent e){
              if(needDrag){
              int xstart = e.getX();
              int ystart = e.getY();
                      x = xstart;
                      y = ystart;
                     repaint();
              }    
              }
             });
     
     addWindowListener(new WindowAdapter() { 
             public void windowClosing(WindowEvent e) { 
               System.exit(0); 
          } 
          }); 
         setVisible(true);
     } 
     
        public void paint(Graphics g) { 
         g.drawRect(x ,y ,100,100);
         } 
    }
      

  8.   

    很简单啊if((xpoint>=50&xpoint <=150)&(ypoint>=50&ypoint <=150))                                                  
       needDrag = true; 
    else 
       needDrag = false;换成if((xpoint>=x&xpoint <=x+100)&(ypoint>=y&ypoint <=y+100)) 
       needDrag = true; 
    else 
       needDrag = false;就哦了
      

  9.   

    出来了 和你说的一样 呵呵 Thanks