Добавление MouseAdapter в JFrame

1

У меня есть 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.

Есть ли приятнее, красивее, элегантнее, более традиционно здорово, более профессионально здорово, так оно и есть, способ сделать это одним способом?

Теги:
swing
jframe
mouselistener

1 ответ

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню