首页 > 解决方案 > JLabel 文字阴影

问题描述

我有一个JLabel文本。文本以不同的颜色显示,由于我也希望背景改变颜色,我发现有时文本很难阅读。这就是为什么我想像这样为字体添加阴影:React Native font outline / textShadow

有人可以告诉我如何在 Java Swing 标签中获得这种效果,或者,如果不可能,我应该使用哪个 Swing 组件来代替?

标签: javaswingtextjlabeltext-shadow

解决方案


您可以将文本转换为轮廓并对其进行描边。

import javax.swing.*;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.image.BufferedImage;

class Test extends JFrame {
    public Test() throws HeadlessException {
        setSize(500, 500);
        add(new JOutlineLabel("test"));
    }
    
    class JOutlineLabel extends JComponent {
        
        int width = 3;
        Shape outline;
        
        public JOutlineLabel(String string) {
            BufferedImage temp = new BufferedImage(200, 200, BufferedImage.TYPE_4BYTE_ABGR);
            Graphics2D g2 = temp.createGraphics();
            
            FontRenderContext frc = g2.getFontRenderContext();
            Font font = new Font("Helvetica", 1, 60);
            
            TextLayout textLayout = new TextLayout(string, font, frc);
            outline = textLayout.getOutline(null);
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2.translate(0, outline.getBounds().height);
            g2.setColor(Color.blue);
            g2.setStroke(new BasicStroke(width));
            g2.draw(outline);
        }
    }
    
    public static void main(String[] args) {
        new Test().setVisible(true);
    }
}

在此处输入图像描述

您将希望避免执行重量级位,例如实例化字体、将文本转换为轮廓等每次绘制。


推荐阅读