拉伸JLabel文本
有没有办法使JLabel的文本伸展到100%的高度? 当组件尺寸改变时,我需要更新文本。
我看到了一些可以工作的解决scheme。 它涉及计算和设置字体大小,所以它看起来是正确的高度。 我也将不得不添加监听器,当高度变化,使其作出回应,我不知道我应该这样做。
我希望与布局经理有更好的解决scheme,但是找不到任何东西。
有任何想法吗?
在下面显示的方法中,使用适当大的Font
大小使用TextLayout
对所需的文本进行成像,并缩放以填充组件。 这里有一个相关的例子。
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, -ry); 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(); } }); } }