如何根据JButton的大小自动增加或减小JButton文本的大小?

5
我正在尝试自动增加/减小JButton文本的字体大小(如果JButton增大/伸展,其文本也会增加,如果JButton减小,则文本也会减小)。 JButtons的默认字体将为Sans-Serif大小20,并且它永远不会低于20(可以是21、30、40或任何大于或等于20但从未低于20)。 我有一个名为MenuJPanel的JPanel,它使用GridLayout添加了5个JButton,随着JPanel的增加/减少,它们的大小也会相应增加/减小。 我选择了GridLayout作为这个目的最好的布局,我错了吗? 我还向MenuJPanel添加了componentResized。 以下是我的代码,部分有效。

enter image description here

public class MenuJPanel extends JPanel {

    private JButton resizeBtn1;
    private JButton resizeBtn2;
    private JButton resizeBtn3;
    private JButton resizeBtn4;
    private JButton resizeBtn5;

    public MenuJPanel() {
        initComponents();
      this.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {

                Font btnFont = resizeBtn1.getFont();
                String btnText = resizeBtn1.getText();

                int stringWidth = resizeBtn1.getFontMetrics(btnFont).stringWidth(btnText);
                int componentWidth = resizeBtn1.getWidth();

                // Find out how much the font can grow in width.
                double widthRatio = (double) componentWidth / (double) stringWidth;

                int newFontSize = (int) (btnFont.getSize() * widthRatio);
                int componentHeight = resizeBtn1.getHeight();

                // Pick a new font size so it will not be larger than the height of label.
                int fontSizeToUse = Math.min(newFontSize, componentHeight);

                // Set the label's font size to the newly determined size.
                resizeBtn1.setFont(new Font(btnFont.getName(), Font.BOLD, fontSizeToUse));
            }
        });
    }

    private void initComponents() {

        resizeBtn1 = new javax.swing.JButton();
        resizeBtn2 = new javax.swing.JButton();
        resizeBtn3 = new javax.swing.JButton();
        resizeBtn4 = new javax.swing.JButton();
        resizeBtn5 = new javax.swing.JButton();

        setLayout(new java.awt.GridLayout(5, 0));

        resizeBtn1.setText("Text to resize 1");
        add(resizeBtn1);

        resizeBtn2.setText("Text to resize 2");
        add(resizeBtn2);

        resizeBtn3.setText("Text to resize 3");
        add(resizeBtn3);

        resizeBtn4.setText("Text to resize 4");
        add(resizeBtn4);

        resizeBtn5.setText("Text to resize 5");
        add(resizeBtn5);
    }
}

3
你的问题是你没有发布一个SSCCE(最小化、完整、可运行的代码示例),btnOperatorLogout是什么,它在主类中的哪里?抱歉我的懒惰打败了我,顺便说一下这个简单的问题已经在论坛上解决了很多次,我可以看到一些关于DeriveFont和JLabel的代码。 - mKorbel
谢谢,我刚刚修复了示例代码。 - jadrijan
1
你能计算内部区域吗(参见有关JButton的行,如果已选择)?这意味着从JButton获取Insets并减去1像素的边框(参见有关JButton的行,如果已选择),然后结果是SwingUtilities#computeStringWidht可用的维度 :-) - mKorbel
1个回答

5
通常情况下,JButtonButtonUI 代理根据设计师选择的字体和平台美学计算按钮的首选大小。但由于您的方法打破了这一点,所以您需要决定文本如何随按钮缩放并容纳按钮装饰。
除非您创建自己的 ButtonUI,否则您可以简单地缩放文本。在此示例中,使用 TextLayoutBufferedImage 中呈现文本,并将其任意放大以根据需要进行缩小。在此示例中,一个数字的字形在 BufferedImage 中呈现,并缩放以适应按钮的当前大小。如果您需要处理 Icon 的相对定位,请参见此处 中介绍的 SwingUtilities.layoutCompoundLabel()

非常感谢您的答复。我还有一个问题,如果我的JButton的文本使用HTML,例如:“<html>Line1<br>Line2</html>”,那么上面的示例是否仍将有效? - jadrijan
谢谢你,我会尝试并告诉你。 - jadrijan
我不确定;layoutCompoundLabel() 可能会处理那个。像这里所展示的那样,为 JPanel 渲染 JLabel可能更容易。 - trashgod

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