【问题标题】:Stretch a JLabel text拉伸 JLabel 文本
【发布时间】:2012-01-07 02:07:06
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: java swing jlabel graphics2d paintcomponent


    【解决方案1】:

    在下面显示的方法中,所需的文本使用TextLayout 使用适当大的Font 大小进行成像,并缩放以填充组件。有一个相关的例子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();
                }
            });
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多