为按钮添加边框使其变小

Adding border to button makes it smaller

当我为我的按钮添加边框时,按钮的尺寸缩小了。我正在使用以下行添加边框:

jButton.setBorder(BorderFactory.createLineBorder(Color.RED));

这是我的无边框按钮:

这是我的带边框按钮:

根据需要定义宽度和高度并执行以下代码行:

jButton.setPreferredSize(new Dimension(width, height));

如果你想添加边框,并且还想在标签文本和边框边缘之间留出边距,创建一个复合边框,内部有一个空边框(边距大小合适)并且不要设置首选尺寸。无论标签的文本和字体如何,这将允许按钮适当地调整自身大小。例如:

LineBorder border1 = new LineBorder(Color.red);
EmptyBorder border2 = new EmptyBorder(1,5,1,5);
Border newBorder = BorderFactory.createCompoundBorder(border1, border2);

一个简单的肮脏例子,说明为什么 setPreferredSize 是一个糟糕的想法以及为什么你应该尽可能避免它。

您还可以查看 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? 以获取有关该主题的更多讨论

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JButton goodButton = new JButton("Location 1");
            Insets insets = goodButton.getInsets();
            goodButton.setBorder(new CompoundBorder(
                            new LineBorder(Color.RED),
                            new EmptyBorder(insets)));
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.insets = new Insets(8, 8, 8, 8);
            add(goodButton, gbc);

            JButton badButton = new JButton("Location 2");
            badButton.setPreferredSize(new Dimension(110, 29));
            badButton.setBorder(new LineBorder(Color.RED));
            add(badButton, gbc);

            ActionListener listener = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    goodButton.setText(random());
                    badButton.setText(random());

                    float size = rnd.nextInt(48) + 12;

                    Font f = goodButton.getFont().deriveFont(size);
                    goodButton.setFont(f);
                    badButton.setFont(f);
                }
            };

            goodButton.addActionListener(listener);
            badButton.addActionListener(listener);
        }

        private Random rnd = new Random();

        protected String random() {
            int length = rnd.nextInt(15) + 5;
            StringBuilder sb = new StringBuilder(length);
            for (int index = 0; index < length; index++) {
                sb.append((char)('A' + rnd.nextInt(26)));
            }
            return sb.toString();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(600, 600);
        }

    }


}

这是一个有点夸张的例子,但不幸的是,我继承了一个项目,以前的开发人员使用该项目 setPreferredSize 并且它在相同的 PC 上工作 "ok" 运行 同样 OS,我们遇到了无数看似随机的问题,还有更多,甚至没有让我开始了解它在 Mac 上的表现OS。

But I'm only developing for Windows

重要的是,正如我所说,我们的应用程序在一些 Windows PC 上运行 "ok",但是一旦有人拥有自定义 DPI 或字体指标,或者他们升级到新版本Windows,它开始分崩离析 - 简答 - 不要使用 setPreferredSize