Java Swing完全圆形的JButton(圆形外区域不能被点击也不可见)

3
我一直在尝试实现一个完全自由边框的JButton:
  • 先前的线程中提供了一个解决方案,可以将形状作为边框:使用Java创建圆角Swing JButton
  • 但是形状外部区域不能被点击
  • 甚至父类(JButton)也没有绘制形状外部区域

有没有一种简单的方法可以在“普通”Swing中完成此操作(不使用任何第三方库)?否则,是否有一个好的免费(当然最好是开源的)第三方库来完成这个任务?

例如,想象一个红色的圆球:我可以给用户的最佳交互是不能在外部区域点击,特别是如果球非常大。

谢谢您提前

(我考虑过使用Java2D从头编写组件,并使用Shape contains()方法来检查点击是否正确。但我会遇到两个主要问题:

  • 为形状提供按下的外观,就像JButton所做的那样 =>正如下面有人指出的那样,如果我使用两个不同的绘图/图像,这并不是最困难的部分

  • 处理事件(ActionListeners)就像JButton所做的那样 =>如果我从JComponent继承,最困难的部分将是在我们没有单击正确区域时拒绝(返回)处理=>如何检测鼠标点击点和区域之间的可能交集是最好的方法?)

)

1
如果应该是一个按钮...你不能使用带有鼠标监听器的JLabel吗?您可以在JLabel中添加图像,以使其看起来像一个圆形按钮,并在悬停时更改图像以模拟交互。在鼠标按下和鼠标释放时,您还设置了不同的图像,并在鼠标按下时实现按钮单击逻辑。如果您使用圆形图像,它应该看起来像一个按钮...或者我误解了您要实现的内容? - peshkira
事实上,JLabel自定义组件仍然是矩形的,这对事件处理来说是一个大问题!特别是如果组件足够大,用户就能看到问题。但我知道,实现这种效果可能非常困难,甚至不可能。 - loloof64
1
请参考http://stackoverflow.com/questions/3439112/java-custom-shape-panels,了解创建RoundButton的简单示例。该代码在3行代码中实现了“点击检测”。 - camickr
非常感谢您 :) 这真的比我在答案评论中提到的自己的方法要好 :) - loloof64
1个回答

4

你有三个选择

1)每个自定义的Look and Feel都实现了Rounded JComponents,这是最安全的方法来轻松地完成它,其中一些为Java Swing GUI带来了出色的输出,并具有长时间的Bug历史记录,我建议使用Substance Look&Feel,但非常敏感于EDT。

2)您可以覆盖整个(自定义Look and Feels已经完成了这个)ButtonUI,但是您的UI_Delegate将是Look and FeelNative_OS敏感的,例如我发布的链接,在Windows平台上使用Metal Look and Feel,如果您想创建一个跨Platform和跨Look&Feel非敏感,则必须覆盖所有可能的PlatformsLook and Feels

3)创建具有Rounded BordersJComponent,填充内部区域,例如GradientPaint,然后添加MouseListenerMouseMotionListenerKeyListener或更好地编写自己的KeyBindings并为避免在监听Listeners之间发生并发性而创建自己的Model,然后您的Custom JButton将是跨Platform和跨Look&Feel非敏感的。

一切由你决定,祝你好运


谢谢 :) 最终我成功了,使用第三种解决方案:继承JLabel子类。但我还创建了一个Ellipse2D.Float子类来存储正确的点击区域:这样我只处理事件,如果MouseEvent#getPoint()在形状区域内(Shape的contains()方法)。我认为这是最明显的方法。 - loloof64
1
+1 很好的总结。这篇文章展示了如何添加自己的UI委托。 - trashgod
谢谢您提供这个链接:我会查看它。 - loloof64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接