2011-11-26 38 views
3

有没有办法让JLabel的文字拉伸达到100%的高度?当组件的尺寸发生变化时,我还需要更新文本。拉伸JLabel文字

我看到了一些可以工作的解决方案;它涉及计算和设置字体大小,使其显示正确的高度。我还必须添加监听器,以便在高度发生变化时进行响应,我不知道我应该在哪里做。

我希望有一个更好的布局管理器解决方案,但找不到任何东西。

任何想法?

回答

7

在下面显示的方法中,所需文本使用TextLayout使用适当大的Font大小成像并缩放以填充组件。有一个相关的例子here

enter image description here

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(); 
      } 
     }); 
    } 
} 
+0

我希望有一个JLabel的一个隐藏的功能,我不知道。这是一个可行的解决方案。谢谢。 – jcbelanger

+0

不客气, (稍微)更新为“JLabel”。 – trashgod

+0

参见[*绘制多行文字*](http://docs.oracle.com/javase/tutorial/2d/text/drawmulstring.html)。 – trashgod