Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change JLabel font size to fill JPanel free space while resizing?

Tags:

java

swing

jlabel

There is a similar question here: How to change the size of the font of a JLabel to take the maximum size

but it doesn't work in backwards.

So if you make JPanel bigger, font is growing, but if you make it smaller JLabel size and font remain as before

Check this Image

How to make Jlabel font growing according to JPanel size while resizing?

like image 864
VextoR Avatar asked Feb 16 '12 13:02

VextoR


People also ask

How do I change the font on a JPanel?

You can call the method setFont() from you JPanel and give it a Font as parameter. Example : setFont(new java. awt.


2 Answers

by using FontMetrics and TextLayout you can get this output (please read an comment in the code)

SwingUtilities can do that correctly too

I sugget to add a few pixels moreover on both directions

add ComponentListener to the container and on componentResized event recalculate FontMetrics again

enter image description here

import java.awt.*;
import java.awt.font.TextLayout;
import java.awt.geom.Rectangle2D;
import javax.swing.*;

public class ShowFontMetrics extends JFrame {

    private static final long serialVersionUID = 1L;
    private JLabel lTime;

    public ShowFontMetrics() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pane = new JPanel();
        pane.setLayout(new FlowLayout());
        lTime = new JLabel("88:88");
        lTime.setFont(new Font("Helvetica", Font.PLAIN, 88));
        FontMetrics fm = lTime.getFontMetrics(lTime.getFont());
        TextLayout layout = new TextLayout(lTime.getText(), lTime.getFont(), fm.getFontRenderContext());
        Rectangle2D bounds = layout.getBounds();
        Dimension d = lTime.getPreferredSize();
        d.height = (int) (bounds.getHeight() + 100);// add huge amount of pixels just for for fun
        d.width = (int) (bounds.getWidth() + 150);// add huge amount of pixels just for for fun
        lTime.setPreferredSize(d);
        lTime.setVerticalAlignment(SwingConstants.CENTER);
        lTime.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        pane.add(lTime);
        setContentPane(pane);
    }

    public static void main(String[] arguments) {
        ShowFontMetrics frame = new ShowFontMetrics();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}
like image 69
mKorbel Avatar answered Oct 13 '22 01:10

mKorbel


Like this? http://java-sl.com/tip_adapt_label_font_size.html

UPDATE:

The code as requested

import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

public class ResizeLabelFont extends JLabel {
    public static final int MIN_FONT_SIZE=3;
    public static final int MAX_FONT_SIZE=240;
    Graphics g;

    public ResizeLabelFont(String text) {
        super(text);
        init();
    }

    protected void init() {
        addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                adaptLabelFont(ResizeLabelFont.this);
            }
        });
    }

    protected void adaptLabelFont(JLabel l) {
        if (g==null) {
            return;
        }
        Rectangle r=l.getBounds();
        int fontSize=MIN_FONT_SIZE;
        Font f=l.getFont();

        Rectangle r1=new Rectangle();
        Rectangle r2=new Rectangle();
        while (fontSize<MAX_FONT_SIZE) {
            r1.setSize(getTextSize(l, f.deriveFont(f.getStyle(), fontSize)));
            r2.setSize(getTextSize(l, f.deriveFont(f.getStyle(),fontSize+1)));
            if (r.contains(r1) && ! r.contains(r2)) {
                break;
            }
            fontSize++;
        }

        setFont(f.deriveFont(f.getStyle(),fontSize));
        repaint();
    }

    private Dimension getTextSize(JLabel l, Font f) {
        Dimension size=new Dimension();
        g.setFont(f);
        FontMetrics fm=g.getFontMetrics(f);
        size.width=fm.stringWidth(l.getText());
        size.height=fm.getHeight();

        return size;
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.g=g;
    }

    public static void main(String[] args) throws Exception {
        ResizeLabelFont label=new ResizeLabelFont("Some text");
        JFrame frame=new JFrame("Resize label font");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add(label);

        frame.setSize(300,300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

}
like image 31
StanislavL Avatar answered Oct 12 '22 23:10

StanislavL