Это связано с 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.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);
это в JDK, sun.font.Font2D. github.com/frohoff/jdk8u-jdk/blob/master/src/share/classes/sun/…
Ссылка на источник Font2D в проекте OpenJDK: hg.openjdk.java.net/jdk/client/file/9fb26c4d8eaa/src/…
Компилятор Java предостерегает вас от использования классов sun.*. Начиная с Java 9, вы вообще не можете их использовать.
Шрифт2D?? вы имеете в виду какие-то внепространственные библиотеки??? Что же вы говорите о??