java - JLabel 文字阴影
问题描述
我有一个JLabel
文本。文本以不同的颜色显示,由于我也希望背景改变颜色,我发现有时文本很难阅读。这就是为什么我想像这样为字体添加阴影:React Native font outline / textShadow
有人可以告诉我如何在 Java Swing 标签中获得这种效果,或者,如果不可能,我应该使用哪个 Swing 组件来代替?
解决方案
您可以将文本转换为轮廓并对其进行描边。
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);
}
}
您将希望避免执行重量级位,例如实例化字体、将文本转换为轮廓等每次绘制。
推荐阅读
- c - TF_AllocateTensor:最后一个“len”参数是多余的吗?
- html - 为什么在另一个 div 内的 div 中,它的顶部/底部边距不像它的左/右边距?
- jquery - removeClass isn't working while addClass in the same condition is working
- bash - 将两个增量列附加到现有文件。重击
- cygwin - Cygwin 绝对路径给出 C://cygdrive/c 而相对路径工作正常
- reactjs - 将组件道具正确扩展为默认的 html 按钮道具
- javascript - 如何使用 Angular5csv 将 json 值存储到不同的 csv 文件中?
- android - 获取对片段或活动之外的 getSharedPreferences 的引用
- tensorflow - 将 TF 模型导入 TensorflowJS(在 Python 中训练)失败:“输入 0 与层展平不兼容:预期 min_ndim=3,发现 ndim=2。”
- android - Kotlin 多平台项目单元测试问题