问题
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