这里有一个类似的问题: How to change the size of the font of a JLabel to take the maximum size
但它不能倒退。
因此,如果您使JPanel
更大,则字体会增长,但如果您缩小JLabel
尺寸并且字体保持不变
如何在调整大小时使Jlabel
字体按JPanel
大小增长?
答案 0 :(得分:4)
使用FontMetrics和TextLayout即可获得此输出(请在代码中阅读评论)
SwingUtilities也可以正确地做到这一点
我建议在两个方向上添加几个像素
将ComponentListener添加到容器中,并在componentResized事件上重新计算FontMetrics
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);
}
}
答案 1 :(得分:4)
喜欢这个? http://java-sl.com/tip_adapt_label_font_size.html
更新:
请求的代码
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);
}
}
答案 2 :(得分:0)
好的,这是答案。
让我们从这里获取代码:How to change the size of the font of a JLabel to take the maximum size,回答 coobird
int componentWidth = label.getWidth();
我们需要从JFrame
组件获取宽度,而不是JLabel
,因为代码不会有机会更改JLabel的大小。
这将解决它:
int componentWidth = this.getWidth()-20; // '20' - according width of Jlabel to JFrame