Java 没有合成斜体字体

Posted

技术标签:

【中文标题】Java 没有合成斜体字体【英文标题】:Java is not Synthesizing Italic Font Faces 【发布时间】:2019-06-16 07:12:18 【问题描述】:

主要问题:

OpenJDK 中是否有一个设置可以像 Oracle JDK 那样合成斜体字体。

背景:

使用 OpenJDK,当在 Graphics2D 对象上绘制文本时,文本不会以倾斜样式出现,除非使用所需字体系列注册了斜体字体。 Oracle 的 JDK 确实会合成斜体字体。还合成了 Swing 组件。

注意事项:

粗体合成,粗斜体合成粗体。 我知道,为了获得最佳效果,应该注册斜体字体。对于已经利用合成字体的应用程序来说,这可能不是一个完美的解决方案。 关于 JavaFX 和字体有很多,这不是 JavaFX,只是 AWT。

这是一个说明问题的简单类。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UnsupportedLookAndFeelException;

public class SimpleFontTest 
    private static Font FONT = new Font("Impact", Font.ITALIC, 18);
    private static String TEXT = "The Quick Brown Fox";

    public static void main(String args[]) throws UnsupportedLookAndFeelException      
        if (args.length > 0 && args[0] != null) 
            String fontName = args[0];
            FONT = new Font(fontName, Font.ITALIC, 18);
        

        JFrame f = new JFrame("Simple Font Test: " + System.getProperty("java.vendor"));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel label = new JLabel("JLabel: " + TEXT);
        label.setFont(FONT);

        GraphicsConfiguration gc = f.getGraphicsConfiguration();
        BufferedImage image = gc.createCompatibleImage(400, 50);
        Graphics2D g = image.createGraphics();
        g.setFont(FONT);
        g.setColor(Color.BLACK);
        g.setBackground(Color.WHITE);
        g.clearRect(0, 0, image.getWidth(), image.getHeight());
        g.drawString("BufferedImage: " + TEXT, 10, 15);
        g.dispose();
        JLabel picLabel = new JLabel(new ImageIcon(image));

        f.add(label, BorderLayout.PAGE_START);
        f.add(picLabel, BorderLayout.CENTER);
        f.setSize(400, 200);
        f.setVisible(true);
    

输出将取决于用于构建和运行类的 JDK。这是一张对比图:

谢谢大家。

【问题讨论】:

我可以确认您的问题。但是您的代码显示与 Oracle JDK 11.0.1 Win64 相同的行为。对我来说似乎是一个错误。 OpenJDK 错误数据库中已经有一些类似的错误。 谢谢你。 OpenJDK 错误库中的类似错误都与 JavaFX 相关(至少是我见过的那些)——我会继续寻找。 Oracle JDK 11.0.1 的复制很有趣。 OpenJDK 使用 FreeType 作为 FontScaler。我想知道 Oracle JDK 11.0.1 是否也使用 FreeType 而不是之前使用的 T2K FontScaler。 你是对的。根据 JDK 11 发行说明 (oracle.com/technetwork/java/javase/…),他们使用的是 FreeType。 我也看到了。那好吧。也许一个错误报告是为了。再次感谢。 仅供参考:错误报告已发送给 Oracle。 【参考方案1】:

因为我不喜欢看到没有答案的问题:看起来这只是从 T2K 字体渲染器更改为 FreeType 的结果。

一些解决方法:

制作斜体字体(如果您在法律上获得许可) 将 AffineTransform 应用于 Font 对象(-20 的倾斜效果很好)。

【讨论】:

对于它的价值,这是在 Java 12 中修复的(链接到上面的错误),我在自己遇到同样的错误后确认了这一点。然而,由于 Java 11 是当前我编写的 LTS 版本,这种解决方法可能需要几年时间,因为大型组织可能只升级到下一个 LTS 版本。

以上是关于Java 没有合成斜体字体的主要内容,如果未能解决你的问题,请参考以下文章

在纸上绘制一个没有斜体的 UML 抽象类?

我们可以在 Java 中将两种字体样式组合在一起吗?

文字排版--字体字号颜色粗体斜体下划线删除线

如何在 Android TextView 中将字体样式设置为粗体、斜体和下划线?

如何在 SwiftUI 中制作斜体圆形样式系统文本?

word2003公式编辑器输入数学公式问题