Для того, чтобы добраться потом до них - нужно было на панель навешивать MouseListener и в зависимости от того, на какую область была нажата мышка - делать обьект "актиным".
Для того, чтобы перетащить прямоугольник - нужно было изменить его местоположение и сделать repaint панели.
Думаю все с таким знакомы.
Последние две недели обрабатываю другой подход:
Код: Выделить всё
class DraggableComponent extends JComponent implements MouseListener, MouseMotionListener
JPanel.add(new DraggableComponent());
Каждый обьект таскает сам себя, на обьекте можно нарисовать рожицу, али ещё чего, в методе paintComponent и всё отлично выглядит.
Прекрасная масштабируемость (добавляешь новый элемент и он сам знает, что с собой делать), не нужно добавлять горы мусора в метод paint той самой панели.
Проблемы возникают же во время взаимосвязи таких обьектов.
Например, если два прямоугольника нужно соединить линией ... Эту линию нужно тоже сделать JComponent и добавить на панель.
В общем-то не сложно.
Но изменения положения прямоугольника должны влиять на положение линии - уже сложнее, но всё ещё реально.
А как насчёт выбрать пару прямоугольников и перетащить их вместе?
Если прямоугольник отвечает только за себя - то нужно опять же обращаться к панели, чтобы узнать, выбраны ли другие обьекты.
И вот уже есть ограничение:
Если сначала DraggableComponent можно было добавить на любую стандартную панель - то теперь это должна быть уже специфическая панель (чего бы не хотелось).
Нет, ну конечно же можно всё это реализовать (и большинство я уже сделал), но вот в чём вопрос:
А нужно ли это?
Действительно ли я получаю достаточно преимуществ при этом?
И какие ещё есть потенциальные недостатки такого подхода?
Преимущества я вижу:
1. В новом подходе работа идёт с "векторной" графикой и, мне кажется, это удобнее при необходимости связи "Графика & события".
2. Кроме того, идёт работа по слоям (ZOrder у любого контейнера) и получается намного проще реализовывать перекрытия обьектов.
3. Чтобы скрыть обьект - достаточно удалить его с панели (или же setVisible(false), только это не всегда отключает обработчик событий), а при необходимости добавить .
Но есть и вышеперечисленные недостатки, которых, по моему, меньше.
Хотелось бы услышать мнение уважаемого сообщества!
Может кто-то уже мучался и знает разные "За" и "Против" ?!
А может уже где-то есть и готовые библиотеки для подобных изощрений?
Искал, не нашел ничего подходящего, неужели никто таким не пользвуется? Если таки нет - значит, наверное, есть на то причины!..