2012-02-09 3 views
1

У меня есть несколько объектов Graphics2D (Line2D, Rectangle2D, Ellipse2D, Rectangle2D) и GeneralPath. Я знаю, что если я хочу попробовать тест на них, я могу использовать метод .contains (Point), но мне нужно нажать тест на эти объекты, когда они не заполнены. Поэтому я просто хочу проверить, нажал ли пользователь на их граница/линия. На данный момент мне не нужно беспокоиться о толщине границы. Предположим, что мне просто нужно беспокоиться, если пользователь нажал в пределах 10 пикселей от границы/линии.Испытание Hit на объекте Graphics2D?

У меня есть MouseListener, где я могу получить координаты щелчка мыши, а объекты Graphics2D хранятся в структуре данных, которую я перебираю. Я просто не знаю, как ударить тест по линиям/границам.

Любые предложения будут оценены!

ответ

2

У меня никогда не было причин использовать его, но, похоже, ваш лучший выбор - это метод Graphics2D.hit()here.

Просто используйте прямоугольник 1px * 1px в позиции мыши и установите для параметра onStroke значение true и убедитесь, что свойства Clip, Transform и Stroke настроены правильно (как указано в javadoc), прежде чем вы это сделаете вызов.

+0

Что делать, если я не забочусь о штрихе, но для определенного расстояния (например, 10px) от границы/хода, как если бы он был шириной 1px? Например, если штрих Ellipse2D равен 20px, но мне нужно только знать, был ли пользователь нажат только в пределах 10 пикселей? – Eric

+0

Я закончил с вызовом Graphics2D.setStroke (10), и он отлично сработал! спасибо Baqueta & Ben – Eric

1

Вот что я хотел бы сделать:

Ellipse2D случай: Каждый раз, когда вы хотите, чтобы увидеть, если мышь коснулась края в Ellipse2D, создать Ellipse2D, который немного больше, чем оригинал, и Ellipse2D что немного меньше. Если точка щелчка мыши находится внутри большего размера Ellipse2D, но за пределами меньшего, то вы нажали «закрыть» к краю исходной фигуры.

Rectangle2D case: Решите это так же, как вы делаете Ellipse2D - сделайте еще один, один меньший, и определите, находится ли ваша мышь внутри большего, но за пределами меньшего.

Line2D case: Создайте Rectangle2D, который окружает вашу Line2D некоторой предопределенной шириной. Затем посмотрите, находится ли ваша мышь внутри этого Rectangle2D.

+0

Я думаю, что решение Бакеты в основном делает то же самое, но более элегантно, чем это. Я не знал о методе G2d.hit() - это круто :) – CodeBlind

+0

ваше предложение может работать лучше из-за моих странных требований, я должен дать ему попробовать :) – Eric

Смежные вопросы