Как изменить размер текста на кнопках - Java Swing

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

позвольте мне сначала показать вам код, и вы поймете, что я имею в виду:

import javax.swing.*;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class SimpleGUI implements ActionListener {
    
    private JFrame frame;
    private JPanel grid;
    private JButton[] buttons;
    
    public SimpleGUI() {
        frame=new JFrame("Buttons grid");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        
        grid=new JPanel();
        buttons=new JButton[100];
        
        
        for (int i=0; i<buttons.length; i++) {
            buttons[i]=new JButton(Integer.toString(i+1));
            buttons[i].setActionCommand(Integer.toString(i+1));
            grid.add(buttons[i]);
            buttons[i].addActionListener(this);
        }
        
        frame.getContentPane().add(grid);
    }
    
    public static void main(String[] args) {
        SimpleGUI gui=new SimpleGUI();
        gui.go();
    }
    
    
    public void go() {
        grid.setLayout(new GridLayout(10,10));
        
        frame.setSize(500,500);
        frame.setVisible(true);
    }


    public void actionPerformed(ActionEvent e) {
        String buttonNum=e.getActionCommand();
        System.out.println("You've pressed "+buttonNum);
    }
    
}

Кнопки слишком малы для размещения текста, поэтому вместо цифр на них появятся три точки. (...) Только когда я расширяю окно (и, соответственно, увеличиваю размер кнопок), числа появляются на кнопках правильно. Есть ли способ заставить текст подстраиваться под размер кнопок, чтобы он всегда был виден?


person so.very.tired    schedule 16.09.2013    source источник


Ответы (2)


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

button.setMargin(new Insets(0, 0, 0, 0));

Если вы хотите сделать кнопки квадратными по умолчанию, вы можете изменить их предпочтительный размер:

buttons[i] = new JButton(Integer.toString(i + 1)) {
    @Override
    public Dimension getPreferredSize() {
        Dimension naturalSize = super.getPreferredSize();
        int sideLength = Math.max(naturalSize.width, naturalSize.height);
        return new Dimension(sideLength, sideLength);
    }
};

Тогда первоначальный макет будет квадратным при использовании pack() (который вы должны использовать, согласно ответу Эндрю Томпсона).

Изменить: предпочтительный размер изменен с учетом обычных предпочтительных размеров кнопки. (Снова кредиты А. Томпсону).

person kiheru    schedule 16.09.2013
comment
@AndrewThompson: основная задача при решении проблем - найти правильный вопрос. Судя по виду прилагаемого sscce (ура! Кто-то дал его), я решил дать дополнительную информацию. Вполне возможно, что ваш решает реальные проблемы, а все остальное - просто артефакты образца. - person kiheru; 17.09.2013
comment
Большое спасибо вам обоим за помощь. kiheru - я не знал, что вы можете переопределить такой метод ... Я думал, вам нужно расширить класс, если вы хотите переопределить один из его методов ... - person so.very.tired; 17.09.2013
comment
@ so.very.tired Пожалуйста. Это анонимный класс, вы можете узнать о них больше в отличном руководстве по java. - person kiheru; 17.09.2013

Сделайте изменение, как показано ниже.

public void go() {
    grid.setLayout(new GridLayout(10,10));

    //frame.setSize(500,500);
    frame.pack();
    frame.setVisible(true);
}

Уловка здесь заключается не в том, чтобы менять кнопки вообще, а в том, чтобы настроить графический интерфейс в соответствии с размером кнопок. Это достигается путем вызова pack() < / a> который ..

Заставляет это окно иметь размер, соответствующий предпочтительному размеру и макету его подкомпонентов. ..

person Andrew Thompson    schedule 16.09.2013