Reputation: 5165
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
How to make Jlabel
font growing according to JPanel
size while resizing?
Upvotes: 5
Views: 9939
Reputation: 57381
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);
}
}
Upvotes: 4
Reputation: 5165
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
Upvotes: 0
Reputation: 109815
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);
}
}
Upvotes: 4