Обеспечение того, что JButton может соответствовать строке заданной длины - PullRequest
4 голосов
/ 18 марта 2009

Допустим, у меня есть JButton, и я хочу, чтобы он был достаточно большим, чтобы вместить строку из 8 "M" символов, независимо от того, какая строка фактически назначена ему, и размера шрифта без использования elipsis. *

JButton должен иметь именно такой размер, ни больше, ни меньше. Используется менеджер раскладок GridBagLayout.

Я попытался переписать метод getPreferredSize () и выполнить вычисление, используя строку и текущий шрифт системы. Расчет возвращает мне разумное значение, однако я понятия не имею, как установить предпочтительный размер таким образом, чтобы также учитывались границы.

Я попытался получить вставки компонента, но все они равны нулю.

Это код моего метода:

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 ]

2 голосов
/ 18 марта 2009

Я думаю, что вы на самом деле уже делаете это правильно. Из Javadoc для 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 голос
/ 18 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...