将JButton绘制成类似JLabel的样式(或者至少没有按钮边缘?)

20

我有一个JButton,出于各种原因,我希望它像一个按钮一样工作,但看起来像一个JLabel。实际上,在内部它并不需要是一个JLabel,我只是不想让凸起的按钮边框出现。

有没有一种简单的方法可以关闭JButton的"按钮外观",但保留所有按钮功能?

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


2
你不能直接使用 JLabel 并处理 onClickEvents 吗? - Nicolas C
首先,我确实需要一个可以传递为JButton的东西。此外,我不仅需要onClickEvents,实际上我需要整个按钮的“东西”-操作、武装等。 - Electrons_Ahoy
5个回答

33
你需要做以下操作:

        setFocusPainted(false);
        setMargin(new Insets(0, 0, 0, 0));
        setContentAreaFilled(false);
        setBorderPainted(false);
        setOpaque(false);
你可能需要排除setFocusPainted(false)如果你希望它实际上绘制焦点(例如在 Windows 好看的虚线边框)。
我在需要“仅图标”按钮的情况下使用了以上代码。

1
完美!这正是我想要的。谢谢! - Electrons_Ahoy
1
我添加了以下代码,然后它看起来就像JLabel一样,并且光标会变成手形,以便用户知道它是可点击的:setBorder(new EmptyBorder(0,0,0,0)); setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - hepcat72
作为替代方案,您还可以使图标更改(例如,阴影)或更改背景颜色,以便告知用户可单击。 - Avrom

2

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

例如:

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

当你点击按钮时,文本仍然会上下移动,而且可以通过点击、按住来“装备”按钮,并通过将鼠标移出按钮区域来“取消装备”。

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


1
button.setBorderPainted( false );
button.setContentAreaFilled( false ); // ?

0
 setContentAreaFilled(false);
 setBorderPainted(false);
 setOpaque(false);

这三行代码就可以解决问题。


-1

是否直接向JLabel添加鼠标监听器会更容易?您可以在mousePressed和mouseReleased上调整颜色,并在mouseClicked上进行操作处理。


3
一个按钮不仅仅是一个鼠标监听器。如何将其与操作相关联?怎么处理按钮的“armed/pressed/released”事件?防抖动技术又该如何实现?让标签行为像一个按钮比让按钮看起来像一个标签要复杂得多,所以采用像素切割的方式会更加简单和少痛苦。 - shemnon

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