JAVA摆动JComponent';s可点击区域

JAVA摆动JComponent';s可点击区域,java,swing,jcomponent,clickable,mouselistener,Java,Swing,Jcomponent,Clickable,Mouselistener,我有一个自定义组件显示*.png图像。图像具有透明和非透明区域。若我将ActionListener(或MouseClickListener)添加到组件中,即使我单击组件的透明区域,它也会引发事件。从视觉上看,它看起来像是在组件外部单击。 我如何声明哪些区域应在单击时作出反应,哪些区域不应作出反应 我读过关于从图像中获取像素,从事件对象中获取坐标,并检查其透明度的内容。这似乎既困难又无效 可能定义此组件的自定义边框或其他内容?您是否尝试将两张相同的图片放在同一个文件中,并仅为第二张图片指定一个较短

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

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


可能定义此组件的自定义边框或其他内容?

您是否尝试将两张相同的图片放在同一个文件中,并仅为第二张图片指定一个较短的宽度?像这样,我想你可以为两张图片添加不同的听众。

你回答了自己的问题

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

我如何声明哪些区域应在单击时作出反应,哪些区域不应作出反应

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

然后,每当调用该方法时,只需要检查这一个位置来确定像素是否透明。

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

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


然后,在鼠标事件中,如果设置了遮罩(值=黑色或1),您只需检查遮罩中的确切像素,如果设置了,则触发。

您可以尝试在侦听器中添加检查,以验证鼠标单击的坐标是否来自我写的关于该情况的不透明区域。这已经够复杂了。如果我要在mouseEnter()处理程序中检查它,那么我应该检查每个鼠标位置点。对于每个鼠标位置点,我必须从图像中获取像素并检查透明度。确实有很多开销,“有很多开销”,但是要么是Java自动地为所有的图像这样做,要么是您为这个对您很重要的特定情况这样做。第二个更有意义![此处完全涵盖][1][1]:这个问题可能已经结束。你能想象这对例如星星形状的物体起作用吗?如果你可以在Photoshop、Gimp和ohters上的一些图片中剪切你的图片,你就不能这样做……否则你必须手动检查坐标……我已经写过关于开销的文章了。例如,如果鼠标离开该区域,我将设置70%的不透明度,当鼠标进入该区域时,设置100%的不透明度。我必须做太多的检查。这是唯一的方法吗?@Yegoshin Maxim:首先,让你的代码正常工作。然后,当您可以度量执行情况时,使您的代码高效。您可以从100%图像生成70%图像一次,然后在mouseEnter和mouseLeave上交换图像。可能我错了,但在我看来,javaFX中的ImageView仅在输入非透明区域时才会引发mouseEnter()。Swing中是否存在类似的类?