【问题标题】:Java is not Synthesizing Italic Font FacesJava 没有合成斜体字体
【发布时间】: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。

标签: java fonts awt


【解决方案1】:

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

一些解决方法:

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

【讨论】:

  • 对于它的价值,这是在 Java 12 中修复的(链接到上面的错误),我在自己遇到同样的错误后确认了这一点。然而,由于 Java 11 是当前我编写的 LTS 版本,这种解决方法可能需要几年时间,因为大型组织可能只升级到下一个 LTS 版本。
猜你喜欢
  • 2020-10-24
  • 2022-07-22
  • 2010-12-13
  • 2011-07-18
  • 2019-06-17
  • 2019-07-20
  • 2011-10-01
  • 2016-03-03
  • 2012-12-10
相关资源
最近更新 更多