Java Swing完全圆形按钮(圆形外部区域无法单击或可见)

Java Swing完全圆形按钮(圆形外部区域无法单击或可见),java,swing,rotation,jbutton,Java,Swing,Rotation,Jbutton,我一直在尝试实现一个完全自由边界的JButton: 作为边界的自由形状,如前一个线程中给出的解决方案: 但无法单击外部区域的形状 并且外部区域的形状不会被绘制,即使是由父类(JButton)绘制 在“普通”Swing(没有任何3d party库)中有没有一种简单的方法可以做到这一点?否则,是否有一个好的免费(开源当然更好)3d party library可以做到这一点 举个例子,想想一个红色的圆圈球:我能给用户的最好的互动是它不能在外部区域点击,特别是如果球真的很大的话 先谢谢你 (我想到了

我一直在尝试实现一个完全自由边界的JButton:

  • 作为边界的自由形状,如前一个线程中给出的解决方案:
  • 但无法单击外部区域的形状
  • 并且外部区域的形状不会被绘制,即使是由父类(JButton)绘制
在“普通”Swing(没有任何3d party库)中有没有一种简单的方法可以做到这一点?否则,是否有一个好的免费(开源当然更好)3d party library可以做到这一点

举个例子,想想一个红色的圆圈球:我能给用户的最好的互动是它不能在外部区域点击,特别是如果球真的很大的话

先谢谢你

(我想到了一个用Java2D从头开始编写的组件,并使用Shape contains()方法来查看单击是否良好。但我会遇到两个主要问题:

  • 如果我使用两个不同的图形/图像,给形状赋予按下的外观,以及JButton所做的=>正如下面有人注意到的那样,这不是最困难的

  • 对于处理事件(ActionListeners)以及JButton Dos it=>如果我从JComponent继承,最困难的将是拒绝(返回)处理,如果我们没有点击好的区域=>检测鼠标点击点和该区域之间最终相交的最佳方法是什么?)

    • 您有三种选择

      1) 每个定制都实现了
      完整的JComponents
      ,这是最安全的方法,而且可能也是正确的,部分定制为
      JavaSwingGUI
      带来了出色的输出,并且有很长的
      Bug
      历史,我建议使用
      Substance
      外观和感觉,但对EDT非常敏感

      2) 您可以覆盖整个系统(自定义
      外观
      已经这样做了),但您的
      UI\u委托
      将是
      外观
      本机操作系统
      敏感的,这意味着链接我发布的示例可以在
      Windows
      平台上使用
      金属外观
      ,如果您想创建一个跨
      平台
      和跨
      外观
      非敏感,则必须覆盖所有可能的
      平台
      外观

      3) 使用
      圆形边框创建
      JComponent
      ,用例如
      GradientPaint
      填充内部区域,然后添加
      MouseListener
      MouseMotionListener
      KeyListener
      或最好编写自己的
      KeyBinding
      并创建自己的
      模型
      ,以避免侦听器之间的一致性
      然后将是您的
      自定义按钮
      平台
      和跨
      外观
      非敏感


      一切。。。。取决于你,幸运的是它应该是一个按钮。。。您不能将JLabel与鼠标侦听器一起使用吗。在Jlabel中添加一个图像,使其看起来像一个圆形按钮,并更改悬停图像以模拟交互。在鼠标下键和鼠标上键时,您还可以设置一个不同的图像,在按下鼠标时,您可以实现按钮单击逻辑。如果你使用圆形图像,它应该看起来像一个按钮。。。或者我误解了,您想要实现什么?事实上,JLabel自定义组件仍然是矩形=>的,这对于事件处理来说是一个大问题!特别是如果组件足够大,用户可以看到问题。但我知道,如果不是不可能的话,这种效果可能很难实现。请参阅:以获取创建RoundButton的简单示例。代码在3行代码中实现了“点击检测”。非常感谢:)这比我在回答评论中提到的方法要好:)谢谢:)最后我使用第三种解决方案进行了管理:从JLabel子类继承。但是我还创建了一个Ellipse2D.Float子类来存储正确的点击区域:这样,只有当MouseEvent#getPoint()位于Shape区域(Shape的contains()方法)时,我才能处理事件。我认为这是最明显的方法。这显示了如何添加您自己的UI委托。感谢您提供此链接:我将查看它