我一直在尝试实现一个完全免费的带边框的 JButton:
- 作为边界的自由形状,作为解决方案在之前的线程中给出:Rounded Swing JButton using Java
- 但是不能点击区域外的形状
- 即使父类 (JButton) 也不会绘制区域外的形状
在“普通”Swing(没有任何 3d 派对库)中是否有一种简单的方法来做到这一点?否则,是否有一个很好的免费(当然开源更好)3d 方库来做到这一点?
举个例子,想想一个红圈球:我能给用户的最好的交互是它不能点击外部区域,尤其是当球真的很大的时候。
提前致谢
(我想到了一个用 Java2D 从头开始编写的组件,并使用 Shape contains() 方法来查看点击是否正确。但我会遇到 2 个主要问题:
为 Shape 提供按下的外观,JButton 也这样做 => 正如下面有人注意到我的那样,如果我使用两个不同的绘图/图像,这并不是最困难的
<用于处理事件 (ActionListeners) 以及 JButton 做它 => 如果我从 JComponent 继承,最困难的是拒绝(返回)处理如果我们没有点击好的区域=> 检测鼠标点击点和区域之间的最终交叉点的最佳方法是什么?)
最佳答案
你有三个选择
1) 每个自定义 Look and Feels已经实现了 Rounded JComponents
,这是最安全的方法,如何舒适且可能正确地执行此操作,其中一部分为 Java Swing GUI
和长 带来了出色的输出Bug
历史,我建议使用 Substance
Look & Feel,但它对 EDT 非常非常敏感
2) 你可以覆盖整个(自定义 Look and Feels
已经做到了)ButtonUI ,但是您的 UI_Delegate
将对 Look and Feel
和 Native_OS
敏感,这意味着我发布的链接示例适用于 Windows
具有Metal Look and Feel
的平台,如果你想创建一个跨Platform
并且跨Look & Feel
非敏感,那么你必须覆盖所有可能的平台
和外观
3) 创建带有Rounded Borders
的JComponent
,填充里面的区域例如GradientPaint
,然后添加MouseListener
、MouseMotionListener
、KeyListener
或更好地编写自己的 KeyBindings
并创建自己的 Model
以避免 linstening 之间的并发 Listeners
,然后将是你的Custom JButton
cross Platform
and cross Look & Feel
non-sensitive
一切....取决于你,祝你好运
关于Java Swing完全圆角的JButton(圆圈外的区域无法点击也看不到),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7696462/