禁用JButton焦点边框

36

我在Java中使用JButton遇到了问题。基本上,我想要禁用按钮的边框(该按钮已添加到JDesktopPane中)。

以下是我的代码:

 JButton j = new JButton("BUTTON");
 j.setIcon(icon1); //icon1 : icon//
 j.setFocusable(true);
 j.setContentAreaFilled(false);
 j.setBounds(90, 20, 130, 30);
 dtp.add(j); //dtp : JDesktopPane//

它可以让边框消失,就像这张图片一样:

输入图像描述

但是当我的鼠标点击进入按钮时(没有移动),按钮周围会出现一个“点”边框,就像这样:

输入图像描述

那么,我该如何设置按钮,以使当我不在按钮区域内移动鼠标时,它仍然像第一张图片一样设置,但是当我在周围移动鼠标时,按钮周围会出现一个带有浅蓝色背景的正方形?


2
“让边框像这张图片一样消失”看起来非常不直观。您还做了什么来使最终用户困惑和混淆? - Andrew Thompson
那么,在这种情况下,你认为哪些词最好?顺便说一句,英语不是我的母语。 - Cocc Cocc
我所指的“不直观”是指无边框按钮,而不是你所写的内容。你所写的非常清晰明了。对于任何困惑,我感到抱歉。 - Andrew Thompson
6个回答

120

那不是边框,而是焦点。您可以使用以下方式将其移除:

jButton1.setFocusPainted(false);

此解决方案不适用于ButtonGroup和JRadioButton。 - david
@david 没问题! :) - zari

11

这可能是一个旧的帖子,但我通过button.setFocusable(false)解决了我的问题。

希望对那些仍在寻找答案的人有所帮助。 干杯。


需要注意的是,这仅适用于工具栏的正确默认行为。在带有 Windows Forms 的 Visual Studio 中,ToolStrip 的 TabStop 默认设置为 false。使用上面的 UI 修复程序来摆脱具有点状边框的工具栏按钮和 ToggleButtons,它们在 Windows 上无论是否有焦点都不会出现这些边框。 - Goombert
除了 JButton 之外的 Component 相关的答案(这就是我来到这里的原因) - jkmartindale

4
经过一番探究,我找到了更好的解决方案。在 Windows 上的 GTK 应用程序中,这也是常见的 UI bug 之一,其中之一就是 GIMP。这极大地困扰着我,所以我想找到一个更好的全局修复方法,而不是手动设置每个控件。
解决方法是将所有常见控件上的焦点颜色设置为透明。我在 Visual Studio 中使用 Windows Forms 进行了广泛的测试。即使聚焦,工具栏按钮和 ToggleButtons 也不应该有虚线边框。工具栏默认情况下应该被设置为 setFocusable(false) ,因为它们在 Windows 中是这样的。其他所有控件都应像 Swing 一样具有虚线边框,但仅在进行焦点循环时才需要。
        // Removes the dotted border around controls which is not consistent with Windows
        UIManager.put("Button.focus", new ColorUIResource(new Color(0, 0, 0, 0)));
        UIManager.put("ToggleButton.focus", new ColorUIResource(new Color(0, 0, 0, 0)));

        // ways to remove it from other controls...
        UIManager.put("CheckBox.focus", new ColorUIResource(new Color(0, 0, 0, 0)));
        UIManager.put("TabbedPane.focus", new ColorUIResource(new Color(0, 0, 0, 0)));
        UIManager.put("RadioButton.focus", new ColorUIResource(new Color(0, 0, 0, 0)));
        UIManager.put("Slider.focus", new ColorUIResource(new Color(0, 0, 0, 0)));

        // figure out combobox
        UIManager.put("ComboBox.focus", new ColorUIResource(new Color(0, 0, 0, 0)));

1

我不认为用普通的 JButton 来做这个是一个好主意。如果你计划在不同平台上显示这个按钮(如 Mac 和 Linux),它将无法在不同平台上显示相似的效果。

从实际角度考虑,button.setFocusPainted(false); 应该能满足你当前的需求。

考虑使用一个扩展的 JLabel,具有类似按钮的行为(带有动作监听器),以避免行为差异。


1
JButton button = new JButton();
button.setFocusPainted(false); //To don't paint borders while 
                              //JButton is in focus.

button.setBorderPainted(false);//To don't paint JButton's borders.

0

看看这个能否帮到你 去除边框

或者也可能是这个

Border emptyBorder = BorderFactory.createEmptyBorder();
yourButton.setBorder(emptyBorder);

当我设置"Border emptyBorder = BorderFactory.createEmptyBorder(); yourButton.setBorder(emptyBorder)"时,它给了我一个没有任何效果的普通按钮。 - Cocc Cocc

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