Java2D: захват события на объекте Line - PullRequest
2 голосов
/ 14 мая 2010

У меня есть JPanel, у которого есть линия, круг и т. Д. Теперь, когда я нажимаю на линию, будет ли событие сообщено как линейное событие или как общее событие JFrame. Мне нужно иметь возможность перемещать линию, если пользователь нажимает на линию и перемещает ее. Возможно ли это в Java2D?

Ответы [ 4 ]

4 голосов
/ 14 мая 2010

Да, но вам нужно будет поработать (см. Java.awt.Shape). В основном вам нужно отслеживать список фигур. JPanel получит событие мыши, которое вы можете перевести в координаты (x, y). Затем вы можете вызвать Shape.contains (x, y), чтобы узнать, были ли нажаты ваши различные фигуры.

Это будет хорошо работать для кругов, полигонов, дуг и т. Д .; однако в случае Line2D это будет работать не так легко, но вы можете использовать Line2D.intersects () с небольшим прямоугольником вокруг щелчка мыши (это также хороший интерфейс, поскольку вы не хотите, чтобы пользователь нажимал точно на пикселе, который трудно увидеть).

2 голосов
/ 14 мая 2010

Не существует такого понятия, как «линейное событие», если вы не решите его реализовать.

Я бы предложил добавить MouseListener и MouseMotionListener к Canvas или JPanel, на которых нарисованы ваши геометрические фигуры. Используйте обратный вызов MouseListener mousePressed(MouseEvent), чтобы определить, была ли нажата заданная фигура. Установив это, используйте метод MouseMotionListener mouseDragged(MouseEvent) для перемещения и перерисовки фигуры при перемещении курсора мыши.

1 голос
/ 14 мая 2010

Вот простой пример , который демонстрирует некоторые приемы, приведенные в других ответах.

0 голосов
/ 14 мая 2010

Я создал библиотеку разметки холста в Java несколько лет назад, и если вам не нужно беспокоиться о преобразованиях на холсте (масштабирование, вращение и т. Д.), Это очень легко сделать.

По сути, вам просто нужно поддерживать коллекцию фигур холста в списке (а не в наборе, потому что порядок Z, вероятно, важен). Мышь слушателя будет на вашем холсте, а не на отдельных фигурах. Добавьте новые элементы в начало вашей коллекции (или повторите список позже).

Когда холст получает событие нажатия мыши, итерация по вашей коллекции фигур, пока вы не найдете тот, который находится под вашими координатами мыши. Самый простой способ сделать это состоит в том, чтобы ваши фигуры реализовали интерфейс, который определяет своего рода метод hitPoint (int x, int y). Таким образом, ваши прямоугольники могут реализовывать функции contains (), линии могут пересекать () или графические пути, вы можете учитывать некоторые отступы и т. Д.

Если сделать еще один шаг вперед, ваши фигуры должны определить собственный метод рисования (Graphics2D g), чтобы вы могли легко делать такие вещи, как поля выбора или установить режим рисования на XOR, чтобы облегчить «перемещение» фигуры. Метод paintComponent вашего холста должен был бы просто перебирать вашу коллекцию фигур, вызывая shape.draw (g) для каждой, передавая экземпляр графики, предоставленный методу paintComponent.

...