【问题标题】:JLabel text shadowJLabel 文字阴影
【发布时间】:2021-09-28 09:08:38
【问题描述】:

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

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

【问题讨论】:

  • 遗憾的是没有。作者的工作方式与我完全不同。我什至无法遵循他们想要实现的目标,更不用说他们的代码甚至做了什么。
  • @galliadll 如果您要使用 JLabel,那么链接的解决方案几乎可以替代。任何其他解决方案都将变得更加复杂
  • 不好意思这么说,但是作者基本上是在类里面写了一个只做这一项任务的代码。但是我发现一旦程序变大,他们使用继承的方式就会适得其反。我有更大的代码,这只是它应该实现的一部分。我不想为了一个简单的效果而重组我的整个班级并有几天的返工。

标签: java swing text jlabel text-shadow


【解决方案1】:

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

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);
    }
}

您需要避免执行重量级的操作,例如实例化字体、将文本转换为轮廓等。

【讨论】:

  • 谢谢你的回答,但我几乎不明白这段代码。我基本上只需要为我的项目复制它。我不确定如何做到这一点并“避免执行重量级”,因为我什至无法将其过滤掉。你能删除你的意思是我应该省略的行吗?
  • 非常感谢。我几乎明白了。我只需要再澄清 2 个: 1. 在行中: g2.translate(0, outline.getBounds().height);我发现 getBounds() 方法不可解析。 2.我的代码也不能处理下面2行的宽度。可能是直接的结果。我没有使用任何布局管理器。布局为空,我对所有内容使用 setBounds 将所有内容放置在我想要的位置。但是 setBounds 在 shape 和 Graphics2D 上都没有得到解决。
  • 您使用的是什么 Java 运行时和版本?翻译正在将文本向下移动文本的高度,否则它会在窗口/组件上方绘制,因为文本位于负 Y 坐标处。
  • Shape.getBounds() 自 Java 1.2 以来一直存在,所以我不确定那里发生了什么。 docs.oracle.com/javase/7/docs/api/java/awt/…
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 2013-09-02
  • 2010-12-15
  • 2011-01-30
  • 2012-07-26
相关资源
最近更新 更多