Java能否指示字体是否为斜体

Java能否指示字体是否为斜体,java,fonts,awt,Java,Fonts,Awt,这与我之前问过的有关 有没有办法确定字体对象是否真的是斜体(而不是要求使用斜体字体) 在我的测试中,Font.isItalic()、Font.getStyle()、Font.getAttributes()都表示,如果字体对象是用Font.italic样式创建的,那么它就是斜体。这不考虑是否找到了正确的斜体字体。结果是一个字体对象,无论出于何种目的,它都是斜体,但实际上呈现为纯文本,您无法通过编程检查这种情况 这会影响Oracle JDK 11和OpenJDK 示例代码: import java.

这与我之前问过的有关

有没有办法确定字体对象是否真的是斜体(而不是要求使用斜体字体)

在我的测试中,Font.isItalic()、Font.getStyle()、Font.getAttributes()都表示,如果字体对象是用Font.italic样式创建的,那么它就是斜体。这不考虑是否找到了正确的斜体字体。结果是一个字体对象,无论出于何种目的,它都是斜体,但实际上呈现为纯文本,您无法通过编程检查这种情况

这会影响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);

Font2D??你指的是一些空间不足的图书馆吗???你到底在说什么?它在JDK中,sun.font.Font2D。OpenJDK项目中的Font2D源代码链接:java编译器警告您不要使用sun.*类。从Java9开始,您根本无法使用它们。