setFont в paint () с использованием MigLayout не изменять размер обратных контейнеров

Я пытаюсь написать панель с 3 вертикальными секциями в MigLayout: верхний рост, средний фиксированный и нижний рост.

Вверху находится JLabel с размером шрифта на основе размера контейнера. Середина также является Jlabel, а нижняя в настоящее время является пустой панелью JPanel.

Окно увеличения - нормально: Окно увеличения

Когда я изменяю размер окна, содержимое не изменяется обратно (обратите внимание, что проблема не в размере шрифта, а в ширине контейнера):  введите описание изображения здесь

Эта проблема существует только тогда, когда в переопределенном методе paint (см. Ниже) вызывается setFont на таймере JLabel.

public class TabRace extends JPanel {
    private JLabel timer;

    public TabRace() {
        super();

        // Set the layout
        this.setLayout(new MigLayout("","[grow]","[grow][][grow]"));

        // Timer label
        timer = new JLabel("00:00:00.000");
        timer.setOpaque(true);
        timer.setBackground(new Color(0, 0, 0));
        timer.setForeground(new Color(255, 255, 255));
        this.add(timer,"grow,wrap");

        // Table label
        JLabel tableCaption = new JLabel("Last Records:");
        this.add(tableCaption,"wrap");

        JPanel bottom = new JPanel();
        this.add(bottom, "grow,wrap");

    }

    public void paint(Graphics g) {
        super.paint(g);

        // Thanks to coobird
        // @see https://stackoverflow.com/questions/2715118/how-to-change-the-size-of-the-font-of-a-jlabel-to-take-the-maximum-size

        Font labelFont = timer.getFont();
        final int stringWidth = timer.getFontMetrics(labelFont).stringWidth(timer.getText());
        final int componentWidth = timer.getWidth();

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

        int newFontSize = (int)(labelFont.getSize() * widthRatio);
        int componentHeight = timer.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.

       // REMOVING NEXT LINE AND RESIZING IS WORKING
       timer.setFont(new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse));

    }

}

Я также пытался поместить JLabel в JPanel. Любые идеи?


person ocirocir    schedule 09.08.2014    source источник
comment
Почему вы делаете это при замене краски? Мне это кажется опасным. Почему бы вместо этого не использовать ComponentListener?   -  person Hovercraft Full Of Eels    schedule 09.08.2014
comment
Я взял этот совет. Я могу попробовать со слушателем   -  person ocirocir    schedule 09.08.2014
comment
Вы никогда не должны изменять состояние компонента в Paint. В этом нет абсолютно никакого смысла.   -  person Guillaume Polet    schedule 10.08.2014
comment
Зачем это нужно? Как изменение размера шрифта влияет на конечное состояние компонента? К моменту вызова краски размер компонента уже рассчитан, так что вы на самом деле врете ...   -  person MadProgrammer    schedule 10.08.2014
comment
@MadProgrammer было ли это сообщение предназначено мне? Или я просто неправильно понял, что вы хотели сказать? Ваше здоровье :-)   -  person Guillaume Polet    schedule 10.08.2014
comment
@GuillaumePolet Нет, это был общий комментарий по вопросу ОП. Почему изменение размера шрифта в paint должно влиять на размер компонента ...   -  person MadProgrammer    schedule 10.08.2014


Ответы (1)


Я не знаю почему, но добавление минимальной ширины к первой JLabel (или другой строке) решает проблему:

this.add(timer,"grow,wrap,wmin 10");
person ocirocir    schedule 11.08.2014
comment
Это связано с тем, что разница между минимальным и предпочтительным размером заключается в тенденции компонента к усадке. Для ярлыка MigLayout, кажется, устанавливает эти два размера равными, поэтому компонент не сжимается. Однако избавиться от многоточия - совсем другое дело. - person Jan Bodnar; 11.08.2014