4

我有一个显示 *.png 图像的自定义组件。图像具有透明和非透明区域。如果我将 ActionListener(或 MouseClickListener)添加到组件,即使我单击组件的透明区域,它也会引发事件。从视觉上看,它看起来像是在组件外部单击。我如何声明哪个区域应该对点击做出反应,哪些不应该?

我读过关于从事件对象的坐标图像中获取像素并检查其透明度的信息。这似乎困难且无效。

也许定义这个组件的自定义边框或其他东西?

4

4 回答 4

3

你是在自问自答。

在 mousePressed() 事件处理程序中,您将必须检查您是否在 JComponent 中,然后检查鼠标单击的 x 和 y 坐标处的像素是否透明。

于 2012-01-18T14:53:20.760 回答
2

我如何声明哪个区域应该对点击做出反应,哪些不应该?

这是通过覆盖该contains(...)方法在 JComponent 级别完成的。例如,您扩展 JLabel 以创建一个透明标签,其中包含您的图标形式的图像。

然后,每当调用此方法时,您只需检查这一位置以确定像素是否透明。

于 2012-01-18T16:07:07.957 回答
1

如果您关于“开销”的主要问题是您只想在鼠标进入图像的非透明部分时使其不透明,我会考虑预先计算图像“蒙版”。

在图像加载时,制作另一个图像(或二维数组,或类似的东西),它将是二进制的(即仅黑白,或仅在数组中的 1 和 0 值)。0/白色 = 透明,1/黑色 = 不透明。

然后,在鼠标事件上,您可以检查掩码中的确切像素是否已设置(值 = 黑色或 1),如果已设置则触发。

于 2014-12-21T05:40:13.020 回答
0

您是否尝试将两张相同的图片文件合并,然后只为第二张图片给它一个短宽度?像那样,我认为您可以为两张图片添加不同的侦听器。

于 2012-01-18T14:51:35.503 回答