假设我有一个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;
}
我觉得这可能与我的组件尚未实现的事实有关,但我完全不确定如何解决这个问题。我是从错误的角度来解决这个问题吗?
答案 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先生的说明获得按钮的插图后,一切都很好。