【问题标题】:Java. Swing. JComponent's clickable area爪哇。摇摆。 JComponent 的可点击区域
【发布时间】:2014-12-21 13:40:13
【问题描述】:

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

我已经阅读了有关从图像中获取像素来自事件对象的坐标并检查其透明度的信息。这似乎很难而且效果不佳。

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

【问题讨论】:

  • 你可以尝试在你的监听器中添加一个检查来验证鼠标点击的坐标是否来自非透明区域
  • 我写过那个案例。它足够复杂。如果我要在 mouseEnter() 处理程序中检查它,那么我应该检查每个鼠标位置点。对于每个鼠标位置点,我必须从图像中获取该像素并检查透明度。开销很大。
  • “有很多开销”,确实,但是 Java 会自动为所有图像执行此操作,或者您为这个对您很重要的特定情况执行此操作。第二个更有意义!
  • [此处全面介绍][1] [1]:stackoverflow.com/questions/6735891/… 该问题可能已结束。

标签: java swing jcomponent clickable mouselistener


【解决方案1】:

您回答了自己的问题。

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

【讨论】:

  • 我写过关于开销的文章。例如,如果鼠标离开区域,我将制作 70% 的不透明度,当鼠标进入该区域时,我将制作 100% 的不透明度。我必须做太多检查。这是唯一的方法吗?
  • @Yegoshin Maxim:首先,让你的代码工作。然后,当您可以衡量执行时,让您的代码高效。您可以一次从 100% 的图像生成 70% 的图像,并在 mouseEnter 和 mouseLeave 上交换图像。
  • 可能是我错了,但在我看来,javaFX 中的 ImageView 仅在您输入非透明区域时才会引发 mouseEntered()。 Swing 中是否存在类似的类?
【解决方案2】:

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

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

那么每当调用此方法时,您只需检查这一位置即可确定像素是否透明。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 你能想象这个例子可以用星星的形状工作吗?甚至是椭圆形。
      • 你不能这样做,如果你可以在Photoshop,Gimp等的一些图片中剪切你的图片......否则你必须手动检查坐标......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多