Перетаскивание JLabel в JPanel с помощью мышиных событий - PullRequest
2 голосов
/ 07 июля 2011

Я использую MouseInputListener (MouseListener + MouseMotionListener) для перетаскивания нескольких JLabel в JPanel.Вот схема того, что я делаю:

MouseClicked: проверьте, есть ли JLabel в области щелчка в JPanel;если да, выберите его (закрасьте в цвет и т. д.).Если нет, ничего не делайте.

MouseDragged: если выбран JLabel, установите расположение этого JLabel с помощью e.getX () и e.getY () события.Если ничего не выбрано, ничего не делать.

MouseReleased: Если выбрана JLabel, закрасьте его обратно в исходный цвет.Выберите ничего (возможно, ноль).Если нет, ничего не делайте.

Это все в JPanel;JPanel реализует MouseInputListener.

Итак, вот в чем проблема: когда начальная позиция JLabel равна 0,0, скажем, я перемещаю ее в 10,10.И после отпускания мыши и ничего не выбирается, когда я нажимаю на 0,0, он выбирает, что JLabel;однако он должен был выбрать его, если я нажму 10,10, потому что это его новая позиция.

Теперь я думаю, что это может быть потому, что я использую неправильные координаты;Я слышал, что значения координат в JPanel являются относительными, поэтому мне приходится каждый раз делать вычитание (то есть конечные начальные координаты), чтобы получить правильные координаты.Я сделал это, но это тоже не сработало.Другая возможность может состоять в том, что Java хранит все исторические координаты X и Y (так что каждый раз, когда я нажимаю на предыдущую координату, я выбираю этот объект), что является чисто воображением!

Каковы ваши предложения?

Заранее спасибо.

1 Ответ

3 голосов
/ 07 июля 2011

Добавьте MouseMotionListener к каждой из меток, а не добавляйте его на панель.Тогда вам не нужно определять, щелкнули ли вы по метке или нет.

См. Component Mover для общей реализации.Вам нужно будет настроить его так, чтобы он поддерживал требования к окраске.

Редактировать:

Если вы добавите слушателя на панель, то координаты всегда будут относительно панели, а не надписи, поэтомуЯ не уверен, в чем проблема.Если вы хотите узнать, щелкнули ли вы по компоненту, используйте метод Container.getComponentAt (Point).

Если вам нужна дополнительная помощь, опубликуйте SSCCE , который демонстрирует проблему

...