确保JButton可以适合给定长度的String

时间:2009-03-18 16:24:09

标签: java swing

假设我有一个JButton,我希望它足够大以容纳一串8“M”字符,无论实际分配给它的字符串和字体大小,都不使用省略号。

JButton必须具有这样的尺寸,不多也不少。正在使用的布局管理器是GridBagLayout。

我尝试覆盖getPreferredSize()方法并使用字符串和系统的当前字体执行计算。计算给了我一些合理的价值,但是,我不知道如何设置首选大小,以便也考虑边界。

我试图获取组件的插图,但它们都是0。

这是我方法的代码:

public void getPreferredSize() {
        Dimension d = super.getPreferredSize();

        // Geometry width indicates how many characters must fit
        char[] pad = new char[propGeometryWidth];
        Arrays.fill(pad, 'M');
        String tmpTemplateString = new String(pad);

        FontMetrics tmpMetrics = getFontMetrics(getFont());
        Rectangle2D tmpR2D = tmpMetrics.getStringBounds(tmpTemplateString, getGraphics());

        int tmpWidth = (int)tmpR2D.getWidth();
        int tmpHeight = (int)(tmpR2D.getHeight() * propGeometryHeight + tmpR2D.getHeight());

        // We need to take into consideration borders and padding!
        Insets insets = getInsets();

        Dimension tmpSize = new Dimension(tmpWidth + insets.left + insets.right, tmpHeight + insets.top + insets.bottom);
        return tmpSize;
}

我觉得这可能与我的组件尚未实现的事实有关,但我完全不确定如何解决这个问题。我是从错误的角度来解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

我认为你实际上可能已经做到了。来自Javadoc for getInsets()

  

如果在此组件上设置了边框,则返回边框的插图;否则调用super.getInsets

对我来说,新创建的JButton会显示java.awt.Insets[top=5,left=17,bottom=5,right=17]具有默认外观的内容,以及java.awt.Insets[top=4,left=16,bottom=4,right=16]具有Windows外观的内容。您使用的是自定义外观吗?

答案 1 :(得分:1)

我找到了问题的原因。问题是我有一个内部有JButton的面板,我在面板上覆盖了该方法(有一个相对复杂的类层次结构)。然后,当然,面板的插图都设置为0.按照Mmyers先生的说明获得按钮的插图后,一切都很好。