以下是一本教材上讲这个时的源码:import java.awt.*;
import java.awt.event.*;
import javax.swing.SwingUtilities;
class Win extends Frame implements MouseListener,MouseMotionListener
{   Button button;
    TextField text;
    int x,y;
    boolean move=false;
    Win()
    { button=new Button("用鼠标拖动我"); 
      text=new TextField("用鼠标拖动我",8);  
      button.addMouseListener(this);
      button.addMouseMotionListener(this);
      text.addMouseListener(this);
      text.addMouseMotionListener(this);
      addMouseMotionListener(this);
      setLayout(new FlowLayout());
      add(button);
      add(text);
      addWindowListener(new WindowAdapter(){   
                          public void windowClosing(WindowEvent e){ 
                             System.exit(0);
                           }
                       });
      setBounds(10,10,350,300);
      setVisible(true); 
      validate();
    }
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e)
    {  
       move=false;
    }
    public void mouseEntered(MouseEvent e)  {}
    public void mouseExited(MouseEvent e) {}
    public void mouseClicked(MouseEvent e){}
    public void mouseMoved(MouseEvent e){} 
    public void mouseDragged(MouseEvent e)
    { Component com=null;
      if(e.getSource() instanceof Component) 
         { com=(Component)e.getSource(); 
           if(com!=this)   
              move=true; 
           e=SwingUtilities.convertMouseEvent(com,e,this); 
           if(move)
           {  x=e.getX();  
              y=e.getY();
              int w=com.getSize().width,
              h=com.getSize().height;
              com.setLocation(x-w/2,y-h/2);
           } 
         }
    }
}
public class Example7_30 
{  public static void main(String args[])
   { Win win=new Win();
   }
}
我就是不明白转移鼠标事件到窗口的那句话到底有什么作用?拖动跟窗口有什么关系呢?谢谢大家了

解决方案 »

  1.   

    convertMouseEvent
    public static MouseEvent convertMouseEvent(Component source,
                                               MouseEvent sourceEvent,
                                               Component destination)返回类似于 sourceEvent 的 MouseEvent,除了其 x 和 y 成员已转换到 destination 的坐标系统。如果 source 为 null,则假定已将 sourceEvent x 和 y 成员转换到 destination 的根组件坐标系统。如果 destination 为 null,则返回的 MouseEvent 将位于 source 的坐标系统中。sourceEvent 不会更改。返回一个新事件。返回事件的 source 字段将被设置为 destination。如果目标为非 null,则在不更改源的情况下使用 translateMouseEvent() 方法将鼠标事件从一个组件转换到另一个组件。 
      

  2.   

    public void mouseDragged(MouseEvent e)
        { Component com=null;
          if(e.getSource() instanceof Component)//判断鼠标事件的来源是不是Component的子类 
             { com=(Component)e.getSource(); //强制转换
               if(com!=this)   //如果com不是Frame,则move为true
                  move=true; 
               e=SwingUtilities.convertMouseEvent(com,e,this); //使得鼠标事件获得com在当前Frame中,对应的坐标值
               if(move)//把被拖的Component移动的鼠标拖动的末位置
               {  x=e.getX();  
                  y=e.getY();
                  int w=com.getSize().width,
                  h=com.getSize().height;
                  com.setLocation(x-w/2,y-h/2);
               } 
             }
        }