2014-07-08 62 views
1

我有,我用它来点击它的背景周围简单地拖动窗口,像这样一个MouseAdapter:添加MouseAdapter到一个JFrame

public class Dragger extends MouseAdapter{ 

private Point offset; 
private Window window; 

public Dragger(Window w){ 
    window = w; 
} 

@Override 
public void mousePressed(MouseEvent e){ 

    offset = e.getPoint(); 
} 

@Override 
public void mouseDragged(MouseEvent e){ 

    Point m = e.getLocationOnScreen(); 

    window.setLocation(m.x - offset.x, m.y - offset.y); 
} 
} 

这么简单吧?

我把它添加到我使用它(我使用它在JDialogUE以及JFrame中,因此“窗口”:

// Drag Listeners 

    Dragger dr = new Dragger(this); 
    addMouseListener(dr); 
    addMouseMotionListener(dr); 

的阻力(目前)只有当工作我建立一个新的牵引,然后将其添加为一个的MouseListener和的MouseMotionListener。

是否有刚刚做的更好,更漂亮,更优雅,更传统的声音,更专业稳健,如此这般,方式一种方法?

回答

1

在这种情况下,我建议Dragger类中编写的辅助静态方法:

public class Dragger extends MouseAdapter 
{ 
    private Point offset; 
    private Window window; 

    public Dragger (final Window w) 
    { 
     window = w; 
    } 

    @Override 
    public void mousePressed (final MouseEvent e) 
    { 
     offset = e.getPoint(); 
    } 

    @Override 
    public void mouseDragged (final MouseEvent e) 
    { 
     final Point m = e.getLocationOnScreen(); 
     window.setLocation (m.x - offset.x, m.y - offset.y); 
    } 

    public static void install (final Window window) 
    { 
     final Dragger dr = new Dragger (window); 
     window.addMouseListener (dr); 
     window.addMouseMotionListener (dr); 
    } 

    public static void uninstall (final Window window) 
    { 
     for (final MouseListener mouseListener : window.getMouseListeners()) 
     { 
      if (mouseListener instanceof Dragger) 
      { 
       window.removeMouseListener (mouseListener); 
      } 
     } 
     for (final MouseMotionListener mouseMotionListener : window.getMouseMotionListeners()) 
     { 
      if (mouseMotionListener instanceof Dragger) 
      { 
       window.removeMouseMotionListener (mouseMotionListener); 
      } 
     } 
    } 
} 

然后只需拨打Dragger.install(window)Dragger.uninstall(window)

不确定这是否是一种好方法,但占用更少的空间,并且可能还会确保您不会添加Dragger两次,如果您向install方法中添加更多检查 - 当然如果您不想要在同一个窗口上安装两次Dragger

同样在这种情况下,您不需要在代码中查看此类的用法,因为您确定如何安装和卸载它,并且可以在一个位置更改该行为,而不是修改大量add*Listener调用。