У меня есть MouseAdapter, который я использую, чтобы перетащить окно, просто щелкнув его фон, например:
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);
}
}
Простой, верно?
И я добавляю его в JFrame, на котором я его использую (я тоже использую его в JDialogUE, поэтому "Окно":
// Drag Listeners
Dragger dr = new Dragger(this);
addMouseListener(dr);
addMouseMotionListener(dr);
Сопротивление ( в настоящее время) работает только тогда, когда я построить новый Dragger, а затем добавить его и как MouseListener и MouseMotionListener.
Есть ли приятнее, красивее, элегантнее, более традиционно здорово, более профессионально здорово, так оно и есть, способ сделать это одним способом?
В таких случаях я бы предложил написать вспомогательные статические методы в классе 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
.