还有一个类似的问题在这里: How to change the size of the font of a JLabel to take the maximum size如何更改JLabel字体大小以在调整大小时填充JPanel空闲空间?
但它不起作用倒退。
所以,如果你让JPanel
更大,字体越来越大,但如果你把它缩小JLabel
大小和字体仍然像以前一样
如何使Jlabel
字体根据JPanel
尺寸,同时调整增长?
还有一个类似的问题在这里: How to change the size of the font of a JLabel to take the maximum size如何更改JLabel字体大小以在调整大小时填充JPanel空闲空间?
但它不起作用倒退。
所以,如果你让JPanel
更大,字体越来越大,但如果你把它缩小JLabel
大小和字体仍然像以前一样
如何使Jlabel
字体根据JPanel
尺寸,同时调整增长?
确定,这里就是答案。
让我们的代码从这里:How to change the size of the font of a JLabel to take the maximum size,从答案coobird
int componentWidth = label.getWidth();
我们需要从JLabel
从JFrame
组件获得宽度,不是,因为代码会没有让机会为改变大小JLabel。
这将解决它:
int componentWidth = this.getWidth()-20; // '20' - according width of Jlabel to JFrame
使用FontMetrics和TextLayout你可以得到这个输出(请阅读代码中的注释)
SwingUtilities能做到正确太
我sugget到另外加上两个方向几个像素
将ComponentListener添加到容器和组件上Resize事件再次重新计算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);
}
}
是这样的? http://java-sl.com/tip_adapt_label_font_size.html
UPDATE:
代码的要求
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);
}
}
对于'deriveFont()'+1。 – trashgod 2012-02-16 19:15:08
我知道这个答案是旧的,但它也是一个只有链接的答案。你能从链接中复制所需的信息吗? – 2015-04-28 18:05:19
你尝试modyifying代码时帧的大小缩小到解决这一问题? – camickr 2012-02-16 16:01:38