Java 摆动焦点边框太小

Java Swing Focus Border too small

首先让我说一下,我很困惑这个问题在 Whosebug 上没有答案——至少我没有找到答案。所以我想我的问题必须非常具体,尽管我不明白为什么。这个问题已经在 1 年前提出过类似的问题 here

这个问题还没有回答,因为它太老了,我会再问一次。我没有像最初的问题那样进行任何金属设计,我所做的只是在面板内创建一个简单的按钮(我正在使用 eclipse 来设计应用程序),但焦点边框仅环绕文本并且不随按钮大小缩放,而只随字体大小缩放。

这是我的整个设计代码(因为我刚开始的时候不多)

    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 1000, 500);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JPanel MainPanel = new JPanel();
    MainPanel.setFocusCycleRoot(true);
    MainPanel.setBackground(Color.DARK_GRAY);
    MainPanel.setBounds(0, 0, 995, 465);
    contentPane.add(MainPanel);
    MainPanel.setLayout(null);

    JButton StartButton = new JButton("Launch Oasis");
    StartButton.setBorder(new LineBorder(Color.BLACK));
    StartButton.setBackground(new Color(169, 169, 169));
    StartButton.setForeground(new Color(0, 128, 128));
    StartButton.setBounds(397, 197, 200, 50);
    StartButton.setFont(new Font("Times New Roman", Font.PLAIN, 30));
    MainPanel.add(StartButton);

我想强调一下原作者所做的同样的事情,我想要绘制焦点边框所以 jButton.setFocusPainted(false); 不能解决我的问题。 焦点边框不随按钮大小缩放有什么明显的原因吗?

首先对代码进行几点观察:

  1. 变量名不应以大写字符开头。学习 Java 命名约定并遵守它们。论坛突出显示您的变量,就像它们是 class 名称一样,使您的代码难以阅读。

  2. Swing 旨在与布局管理器一起使用。不要使用 setBounds()。阅读有关 Layout Managers 的 Swing 教程部分,了解更多信息和工作示例。

Is there any obvious reason for the focus border no scaling with the size of the button?

它应该随按钮的大小缩放有什么明显的原因吗?

焦点边框设计为按钮具有焦点时的视觉提示。

每个 LAF 都可以选择应该如何完成。

此 LAF 选择在 text/icon 周围设置焦点边框。

我建议如果它缩放到按钮的大小,那么您将看不到它,因为它会与边框融为一体。

如果您不喜欢 left/right 边距大于 top/bottom 边距,那么您可以使用:

button.setMargins( new Insets(5, 5, 5, 5) );

再次。 LAF 的设计者喜欢更大的水平边距。 编辑:

Is there any way to give this jButton a windows feeling

使用 Windows LAF。

"Modifying the Look and Feel" 上的 Swing 教程中有一节。您已经获得了 Swing 教程的 link。单击教程中每个部分页面顶部的 "Trail" link,您将在目录的 Table 中找到该部分。

此答案包含我针对 camickr 提供的资源所做的研究。

通过在 创建 JFrame 之前将以下内容添加到主方法中,将应用程序的外观更改为 Windows 外观。要使其正常工作,您需要 import javax.swing.UIManager;:

try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (Exception e) {
        System.out.println("Error");
    }

这会在按钮边框旁边为您提供一个焦点边框,环绕整个按钮。请注意,此方法可以抛出一堆异常 (ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException)。有关此主题的更多信息,您可以访问摆动教程的 Modifying the Look and Feel 部分。