2009-03-18 3 views
4

Предположим, у меня есть JButton, и я хочу, чтобы он был достаточно большим, чтобы соответствовать строке из 8 символов «M», независимо от строки, которая фактически назначена это и размер шрифта, без использования elipsis.Обеспечение того, что JButton может соответствовать строкам заданной длины

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

Думаю, вы действительно можете сделать это прямо сейчас. От 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

Я нашел причину своей проблемы. Проблема в том, что у меня была панель с JButton внутри, и я перезаписал метод на панели (существует относительно сложная иерархия классов). Тогда, конечно, для вставки для Panel все равно 0. После получения вставки для кнопки, как заявил г-н Ммайерс, все это отлично работает.

Смежные вопросы