Как автоматически увеличить или уменьшить размер текста JButton в зависимости от размера JButton?

Я пытаюсь автоматически увеличить/уменьшить размер шрифта текста JButton (если JButton увеличивает/растягивается, его текст также увеличивается, если JButton уменьшается, его текст также уменьшается). Шрифт по умолчанию для JButtons будет иметь размер Sans-Serif 20, и он никогда не может быть меньше 20 (это может быть 21, 30, 40 или что-то большее или равное 20, но никогда не меньше 20). У меня есть JPanel, называемый MenuJPanel, он использует GridLayout для добавления 5 JButtons, которые будут увеличиваться/уменьшаться в размере по мере увеличения/уменьшения JPanel. Я выбрал GridLayout, поскольку он кажется лучшим макетом для этой цели, я ошибаюсь? Я также добавил компонент Resized в MenuJPanel. Ниже вы можете увидеть мой код, который частично работает.

введите здесь описание изображения

public class MenuJPanel extends JPanel {

    private JButton resizeBtn1;
    private JButton resizeBtn2;
    private JButton resizeBtn3;
    private JButton resizeBtn4;
    private JButton resizeBtn5;

    public MenuJPanel() {
        initComponents();
      this.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {

                Font btnFont = resizeBtn1.getFont();
                String btnText = resizeBtn1.getText();

                int stringWidth = resizeBtn1.getFontMetrics(btnFont).stringWidth(btnText);
                int componentWidth = resizeBtn1.getWidth();

                // Find out how much the font can grow in width.
                double widthRatio = (double) componentWidth / (double) stringWidth;

                int newFontSize = (int) (btnFont.getSize() * widthRatio);
                int componentHeight = resizeBtn1.getHeight();

                // Pick a new font size so it will not be larger than the height of label.
                int fontSizeToUse = Math.min(newFontSize, componentHeight);

                // Set the label's font size to the newly determined size.
                resizeBtn1.setFont(new Font(btnFont.getName(), Font.BOLD, fontSizeToUse));
            }
        });
    }

    private void initComponents() {

        resizeBtn1 = new javax.swing.JButton();
        resizeBtn2 = new javax.swing.JButton();
        resizeBtn3 = new javax.swing.JButton();
        resizeBtn4 = new javax.swing.JButton();
        resizeBtn5 = new javax.swing.JButton();

        setLayout(new java.awt.GridLayout(5, 0));

        resizeBtn1.setText("Text to resize 1");
        add(resizeBtn1);

        resizeBtn2.setText("Text to resize 2");
        add(resizeBtn2);

        resizeBtn3.setText("Text to resize 3");
        add(resizeBtn3);

        resizeBtn4.setText("Text to resize 4");
        add(resizeBtn4);

        resizeBtn5.setText("Text to resize 5");
        add(resizeBtn5);
    }
}

person jadrijan    schedule 05.12.2012    source источник
comment
ваша проблема в том, что вы не опубликовали SSCCE, что такое btnOperatorLogout, где в основном классе, извините, лень меня тоже побила, кстати, эта простая проблема решалась много раз на этом форуме, я могу увидеть несколько кодов для DeriveFont & JLabel   -  person mKorbel    schedule 05.12.2012
comment
спасибо, я только что исправил пример кода   -  person jadrijan    schedule 05.12.2012
comment
можете ли вы вычислить внутреннюю область (см. строку о JButton, если она выбрана), что означает получение вставок из JButton и минус 1 пиксель для границ (см. строку о JButton, если она выбрана), тогда результатом будет доступное измерение для SwingUtilities#computeStringWidht :-)   -  person mKorbel    schedule 05.12.2012


Ответы (1)


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

Если вы не создаете свой собственный ButtonUI, вы можете просто масштабировать текст. В этом примере TextLayout используется для отображения текста в BufferedImage произвольно большого размера, который можно уменьшить по мере необходимости. . В этом примере глиф одной цифры отображается в виде BufferedImage и масштабируется в соответствии с текущим размером кнопки. Если вам нужно разобраться с относительным позиционированием Icon, см. SwingUtilities.layoutCompoundLabel(), рассмотренный здесь.

person trashgod    schedule 05.12.2012
comment
Большое спасибо за этот ответ. У меня есть еще один вопрос: что, если текст моего JButton использует HTML, например: ‹html›Line1‹br›Line2‹/html›, будут ли приведенные выше примеры работать? - person jadrijan; 05.12.2012
comment
Спасибо попробую и сообщу - person jadrijan; 06.12.2012
comment
Я не уверен; layoutCompoundLabel() может с этим справиться. Может быть проще визуализировать JLabel, как показано здесь для JPanel [отредактировано]. - person trashgod; 06.12.2012