Джава.Качели.Кликабельная область JComponent - PullRequest
3 голосов
/ 18 января 2012

У меня есть пользовательский компонент, отображающий * .png изображение.Изображение имеет прозрачную и непрозрачную область.Если я добавлю ActionListener (или MouseClickListener) к компоненту, он будет вызывать события, даже если я нажму на прозрачную область компонента.Визуально это выглядит как нажатие за пределы компонента.Как я могу объявить, какая область должна реагировать на клики, а какая нет?

Я читал о том, как получить пиксель из изображения ваши координаты из объекта события и проверить его прозрачность.Это кажется трудным и неэффективным.

Может быть, определить пользовательскую границу этого компонента или что-то еще?

Ответы [ 4 ]

3 голосов
/ 18 января 2012

Вы ответили на свой вопрос.

В обработчике события mousePressed () вам нужно будет проверить, находится ли вы в JComponent, а затем проверить пиксель в координатах x и y.щелчка мыши для прозрачности.

2 голосов
/ 18 января 2012

Как я могу объявить, какая область должна реагировать на клики, а какая нет?

Это делается на уровне JComponent путем переопределения метода contains(...). Например, вы расширяете JLabel, чтобы создать TransparentLabel, который содержит ваше изображение в виде значка.

Тогда, когда этот метод вызывается, вам нужно только проверить это одно местоположение, чтобы определить, является ли пиксель прозрачным или нет.

1 голос
/ 21 декабря 2014

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

При загрузке изображения создайте другое изображение (или двумерный массив, или что-то подобное), которое будет двоичным (т.е. только черно-белое или только значения 1 и 0 в массиве).0 / белый = прозрачный, 1 / черный = непрозрачный.

Затем, при событиях мыши, вы можете просто проверить точный пиксель в маске, если он установлен (значение = черный или 1), и вызватьесли это так.

0 голосов
/ 18 января 2012

Вы пытались спрятать два одинаковых файла изображений и только для второго изображения дать ему короткую ширину?Например, я думаю, вы можете добавить разные листы для обеих картинок.

...