绘制一个 JButton 看起来像一个 JLabel(或者至少没有按钮边缘?)

Posted

技术标签:

【中文标题】绘制一个 JButton 看起来像一个 JLabel(或者至少没有按钮边缘?)【英文标题】:Draw a JButton to look like a JLabel (or at least without the button edge?) 【发布时间】:2011-03-02 19:19:00 【问题描述】:

我有一个 JButton,出于各种原因,我想表现得像一个按钮,但看起来像一个 JLabel。它实际上不必是引擎盖下的 JLabel,我只是不希望出现凸起的按钮边缘。

是否有一种简单的方法可以关闭 JButton 的“按钮外观”但保留所有按钮功能?

我可以构建某种组合的子类超级按钮,将其委托给 jlabel 用于显示目的,但我真的希望有类似 button.lookLikeAButton(false) 的东西。

【问题讨论】:

你不能直接使用JLabel并处理onClickEvents吗? 嗯,对于初学者来说,我确实需要一些可以作为 JButton 传递的东西。此外,我不仅需要 onClickEvents,我实际上还需要整个按钮“东西”——动作、武装等。 【参考方案1】:
 setContentAreaFilled(false);
 setBorderPainted(false);
 setOpaque(false);

这三行可以解决问题。

【讨论】:

【参考方案2】:

您需要执行以下操作:

        setFocusPainted(false);
        setMargin(new Insets(0, 0, 0, 0));
        setContentAreaFilled(false);
        setBorderPainted(false);
        setOpaque(false);

如果您希望 setFocusPainted(false) 实际绘制焦点(例如 Windows 外观上的虚线边框),您可能需要排除它。

在我想要一个“仅图标”按钮的情况下,我使用了上面的代码。

【讨论】:

完美!这正是我想要的。谢谢! 我添加了这些,然后它看起来就像 JLabel 并且光标会变成一只手,所以用户知道它是可点击的:setBorder(new EmptyBorder(0,0,0,0)); setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 作为替代方案,您还可以更改图标(例如阴影)或更改背景颜色以让用户知道它是可点击的。【参考方案3】:
button.setBorderPainted( false );
button.setContentAreaFilled( false ); // ?

【讨论】:

【参考方案4】:

将鼠标侦听器添加到 JLabel 实际上会更容易吗?你可以在mousePressed和mouseReleased上调整颜色,在mouseClicked上做你的动作处理吗?

【讨论】:

按钮比鼠标监听器要多得多。把它和一个动作联系起来怎么样?武装/压制/释放呢?去抖怎么办?让标签表现得像一个按钮比让一个按钮看起来像一个标签要复杂得多,所以进行像素截断,它会不那么痛苦。【参考方案5】:

将背景颜色设置为透明,并将边框设置为 EmptyBorder 实例。

例如

   JButton button = new JButton();
   button.setBackground(null);
   button.setOpaque(false);
   button.setBorder(new EmptyBorder());

当您单击按钮时,文本仍然会上下移动,并且仍然可以通过单击、按住和将鼠标移出按钮区域来“解除”按钮。

如果您不想要这种行为,那么您可能不想使用按钮,而是使用真正的标签。

【讨论】:

以上是关于绘制一个 JButton 看起来像一个 JLabel(或者至少没有按钮边缘?)的主要内容,如果未能解决你的问题,请参考以下文章

通过按JButton在随机JPanel上绘制圆圈

Swing:如何在每个组件、JPanel、JButton 等上绘制动画?

如何通过单击 JButton 添加 JPanel?

从 JButton 中删除一个 ActionListener

当我在上下文中绘制文本时,为什么文本看起来像这样?

JButton变换样式