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

怎甘沉沦 提交于 2019-12-22 07:01:05

问题


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?


回答1:


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

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);
    }
}



回答2:


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);
    }

}



回答3:


ok, here is answer.

Let's take the code from here: How to change the size of the font of a JLabel to take the maximum size, answer from coobird

int componentWidth = label.getWidth();

We need to get width from the JFrame component, NOT from JLabel, because the code will no let opportunity to change size for the JLabel.

this will fix it:

int componentWidth = this.getWidth()-20; // '20' - according width of Jlabel to JFrame


来源:https://stackoverflow.com/questions/9311720/how-to-change-jlabel-font-size-to-fill-jpanel-free-space-while-resizing

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!