【问题标题】:How to automatically increase or decease size of JButton text based on the size of JButton?如何根据 JButton 的大小自动增加或减小 JButton 文本的大小?
【发布时间】:2012-11-23 09:25:54
【问题描述】:

我正在尝试自动增加/减少 JButton 文本的字体大小(如果 JButton 增加/拉伸它的文本也会增加,如果 JButton 减小它的文本也会减少)。 JButtons 的默认字体是 Sans-Serif 大小 20,它永远不会小于 20(它可以是 21、30、40 或大于或等于 20 的任何值,但永远不会小于 20)。我有一个名为 MenuJPanel 的 JPanel,它使用 GridLayout 添加 5 个 JButton,随着 JPanel 的增加/减少,这些按钮的大小会增加/减少。我选择了 GridLayout,因为它似乎是为此目的的最佳布局,我错了吗?我还在 MenuJPanel 中添加了一个 componentResized。您可以在下面看到我的代码部分有效。

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);
    }
}

【问题讨论】:

  • 您的问题是您没有发布SSCCE,什么btnOperatorLogout,在主类中,对不起懒惰也打败了我,顺便说一下这个简单的问题在这个论坛上解决了很多次,我可以看到DeriveFont & JLabel 的一些代码
  • 谢谢,我刚刚修复了示例代码
  • 你是否能够计算内部区域(如果选中,请参阅有关 JButton 的行)意味着从 JButton 获取插图和为边框获取负 1 像素(如果选中,请参阅有关 JButton 的行),然后结果可用于SwingUtilities#computeStringWidht :-)

标签: java swing jpanel jbutton grid-layout


【解决方案1】:

通常,JButtonButtonUI 代表会根据设计者选择的字体和平台的美学来计算按钮的首选大小。当您的方法解决了这个问题时,由您决定文本如何随按钮缩放并适应按钮装饰。

无需创建自己的ButtonUI,您可以简单地缩放文本。在这个example 中,TextLayout 用于以任意大的尺寸呈现BufferedImage 中的文本,可以根据需要缩小。在这个example 中,单个数字的字形在BufferedImage 中呈现并缩放以适合按钮的当前大小。如果您需要处理Icon 的相对定位,请参阅SwingUtilities.layoutCompoundLabel(),检查here

【讨论】:

  • 非常感谢您的回答。我还有一个问题,如果我的 JButton 的 Text 使用 HTML 例如:“Line1
    Line2”,上面的示例仍然有效吗?
  • 谢谢,我会试试,让你知道
  • 我不确定; layoutCompoundLabel() 可以处理。渲染JLabel 可能更容易,如here for JPanel 所示[已编辑]。
猜你喜欢
  • 2014-01-30
  • 2013-12-26
  • 2012-01-30
  • 2016-06-17
  • 2011-06-29
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多