Java 拉伸JLabel文本
有没有办法将JLabel的文本拉伸到100%的高度?我需要的文本更新时,组件的大小变化以及 我看到了一些可行的解决方案;它涉及计算和设置字体大小,使其显示正确的高度。我还必须添加侦听器,以便在高度发生变化时做出响应,但我不知道应该在哪里这样做 我希望有一个更好的解决方案与布局经理,但找不到任何东西Java 拉伸JLabel文本,java,swing,jlabel,graphics2d,paintcomponent,Java,Swing,Jlabel,Graphics2d,Paintcomponent,有没有办法将JLabel的文本拉伸到100%的高度?我需要的文本更新时,组件的大小变化以及 我看到了一些可行的解决方案;它涉及计算和设置字体大小,使其显示正确的高度。我还必须添加侦听器,以便在高度发生变化时做出响应,但我不知道应该在哪里这样做 我希望有一个更好的解决方案与布局经理,但找不到任何东西 有什么想法吗?在下面所示的方法中,使用适当大的字体对所需文本进行成像,并缩放以填充组件。有一个相关的例子 另见。 import java.awt.Dimension; import java.awt
有什么想法吗?在下面所示的方法中,使用适当大的
字体对所需文本进行成像,并缩放以填充组件。有一个相关的例子
另见。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JLabel;
/** @see https://stackoverflow.com/questions/8281886 */
public class LayoutTest extends JLabel {
private static final int SIZE = 256;
private BufferedImage image;
private LayoutTest(String string) {
super(string);
image = createImage(super.getText());
}
@Override
public void setText(String text) {
super.setText(text);
image = createImage(super.getText());
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(image.getWidth() / 2, image.getHeight() / 2);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}
private BufferedImage createImage(String label) {
Font font = new Font(Font.SERIF, Font.PLAIN, SIZE);
FontRenderContext frc = new FontRenderContext(null, true, true);
TextLayout layout = new TextLayout(label, font, frc);
Rectangle r = layout.getPixelBounds(null, 0, 0);
System.out.println(r);
BufferedImage bi = new BufferedImage(
r.width + 1, r.height + 1, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) bi.getGraphics();
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(getBackground());
g2d.fillRect(0, 0, bi.getWidth(), bi.getHeight());
g2d.setColor(getForeground());
layout.draw(g2d, 0, -r.y);
g2d.dispose();
return bi;
}
private static void display() {
JFrame f = new JFrame("LayoutTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new LayoutTest("Sample"));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
display();
}
});
}
}