Java не синтезирует курсивные грани шрифта - PullRequest
0 голосов
/ 22 января 2019

Основной вопрос:

Есть ли в 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, используемого для сборки и запуска класса.Вот изображение для сравнения: enter image description here

Спасибо всем.

1 Ответ

0 голосов
/ 23 января 2019

Потому что я не люблю видеть вопросы без ответов: похоже, это просто результат перехода с средства визуализации шрифтов T2K на FreeType.

Некоторые обходные пути:

  • Сделать начертание шрифта курсивом (если вам это разрешено лицензией)
  • Применение AffineTransform к объекту Font (хорошо работает перекос -20).
...