Может ли Java указать, является ли шрифт курсивом

Это связано с Java не синтезирует курсивный шрифт, о котором я спрашивал ранее.

Есть ли способ определить, является ли объект Font курсивом В самом деле (а не тем, что было запрошено курсивное начертание шрифта)?

В моем тестировании Font.isItalic(), Font.getStyle(), Font.getAttributes() все указывают, что объект Font является курсивом, если он был создан с использованием стиля Font.ITALIC. При этом не учитывается, было ли найдено правильное курсивное начертание. В результате объект Font, который во всех смыслах и целях выделен курсивом, но на самом деле отображается просто, и вы не можете программно проверить это условие.

Это влияет на Oracle JDK 11 и OpenJDK.

Пример кода:

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

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

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[]){     
        if (args.length > 0 && args[0] != null) {
            String fontName = args[0];
            FONT = new Font(fontName, Font.ITALIC, 18);
        }

        // All the different ways that this proves the font is italic
        System.out.println("isItalic? " + FONT.isItalic());
        System.out.println("style is Font.ITALIC? " + ((FONT.getStyle() & 0b10) == Font.ITALIC));
        System.out.println("attributes include POSTURE_OBLIQUE? " + FONT.getAttributes().get(TextAttribute.POSTURE).equals(TextAttribute.POSTURE_OBLIQUE));

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

СИСТЕМНЫЙ ВЫХОД:

isItalic? true 
style is Font.ITALIC? true 
attributes include POSTURE_OBLIQUE? true

Графический вывод:

Может ли Java указать, является ли шрифт курсивом

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
592
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел обходной путь (пока). java.awt.Font не будет правильно указывать стиль. Однако вы можете использовать Font2D. Вот образец того, что мне нужно.

String fontname = "someArbitraryString";
FontManager fm = FontManagerFactory.getInstance();
Font2D f2d = fm.findFont2D(fontName, Font.ITALIC, FontManager.LOGICAL_FALLBACK);
boolean isItalic = (f2d.getStyle() & 0b10) == Font.ITALIC);

Шрифт2D?? вы имеете в виду какие-то внепространственные библиотеки??? Что же вы говорите о??

gpasch 24.01.2019 06:50

это в JDK, sun.font.Font2D. github.com/frohoff/jdk8u-jdk/blob/master/src/share/classes/s‌​un/…

TCCV 24.01.2019 15:41

Ссылка на источник Font2D в проекте OpenJDK: hg.openjdk.java.net/jdk/client/file/9fb26c4d8eaa/src/…

TCCV 24.01.2019 16:03

Компилятор Java предостерегает вас от использования классов sun.*. Начиная с Java 9, вы вообще не можете их использовать.

VGR 26.11.2020 15:02

Другие вопросы по теме