Как измерить необходимый размер для кнопки в Java - PullRequest
1 голос
/ 04 августа 2009

Мне нужно сделать кнопку, которая будет отображать разные вещи в зависимости от состояния приложения. Так, например, если ничего не было открыто, его заголовок будет «Планы уроков», а если проект B открыт, то это будет «План уроков проекта B», для этого я использую класс java.awt.Button. Мой вопрос, есть ли способ определить, насколько большой должна быть кнопка, чтобы соответствовать данному тексту. Например, могу ли я как-то получить ширину каждого символа в данном шрифте, используемом кнопкой, а затем умножить это на символы в названии, которое я хочу использовать? Как бы я получил эту ширину символа или есть какой-то лучший способ? Спасибо!

Ответы [ 4 ]

4 голосов
/ 04 августа 2009

Измерение ширины отдельных символов в отдельных шрифтах (не все символы имеют одинаковую ширину) усложняется, особенно если вы хотите учесть пробелы между символами и добавить некоторые поля с обеих сторон, чтобы они не сталкивались с края кнопки. (N.B. Другие предоставили несколько способов сделать это проще, чем я думал, было возможно!)

Гораздо лучше / более обычное решение - позволить Java сделать всю работу за вас. Если вы используете java.awt.Button (или javax.swing.JButton), то он обычно будет автоматически соответствовать размеру текста на нем. Если ваша конкретная кнопка ведет себя странно, то, возможно, у вас проблема с макетом. Обратитесь к разделу учебника Java по Менеджерам макета для получения дополнительной информации.

В качестве примера (в Swing, а не в AWT - извините!) Эти две кнопки в конечном итоге имеют правильный размер текста на них:

import javax.swing.*;

public class ButtonTest {
    public static void main(String[] args) {
        JButton button1 = new JButton("Some label");
        JButton button2 = new JButton("Some much longer label");
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.add(button1);
        panel.add(button2);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

Если вам действительно нужен размер, а не просто позволить Java работать наилучшим образом, я бы рекомендовал вызывать button1.getPreferredSize() и button2.getPreferredSize() после вызова frame.pack().

0 голосов
/ 04 августа 2009

На кнопке awt вы можете вызвать getFontMetrics, а затем запросить getStringBounds. Затем вы можете установить предпочтительный размер кнопки на основе этого. Он не будет учитывать дополнительный интервал, который вам понадобится для границ (который зависит от платформы).

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

0 голосов
/ 04 августа 2009

Вы пытались использовать getMinimumSize() или getPreferredSize() на кнопке? Я полагаю, что один из них скажет вам, какой минимальный размер кнопки должен быть для отображения ее метки.

0 голосов
/ 04 августа 2009

Просто беглый взгляд на API Документы показывает:

public Rectangle2D getStringBounds(String str, FontRenderContext frc)

в java.awt. Шрифт

Возвращает логические границы указанной строки в указанном FontRenderContext. логические границы содержат начало, восхождение, продвижение и высоту, включая ведение

Так что это должно вам помочь.

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