Java 如何加载逻辑字体和物理字体?(制作JComboBox字体选择器)

Java 如何加载逻辑字体和物理字体?(制作JComboBox字体选择器),java,swing,fonts,load,classloader,Java,Swing,Fonts,Load,Classloader,下面是这个问题的后续问题: 似乎有逻辑和物理字体。逻辑字体为: Serif、SansSerif、等距、Dialog和DialogInput 这些字体是动态的,它们各自的物理字体(它们将在程序执行期间表示的字体)在程序加载时确定 我需要访问这些逻辑字体的物理字体 我的第一个想法是尝试加载这些文件: 通过使用这样的方法: 然后从这些属性文件中获取物理字体 但是,在尝试使用第一个文件中的名称加载属性时,我只是得到了NullPointerException(没有找到它们,但我已经检查并在我的系统上

下面是这个问题的后续问题:

似乎有逻辑和物理字体。逻辑字体为: Serif、SansSerif、等距、Dialog和DialogInput

这些字体是动态的,它们各自的物理字体(它们将在程序执行期间表示的字体)在程序加载时确定

我需要访问这些逻辑字体的物理字体

我的第一个想法是尝试加载这些文件:

通过使用这样的方法:

然后从这些属性文件中获取物理字体

但是,在尝试使用第一个文件中的名称加载属性时,我只是得到了NullPointerException(没有找到它们,但我已经检查并在我的系统上找到了它们)。我不知道为什么会这样,但不管怎样,我还是忍不住想一定有更简单的方法可以做到这一点。

公共静态字体getPhysicalFont(字体逻辑字体){
public static Font getPhysicalFont(Font logicalFont) {
    for (int i=0; i<FontManager.getRegisteredFonts().length; i++) {
        Font2D font = FontManager.getRegisteredFonts()[i];
        if (font instanceof CompositeFont && font.getFontName(Locale.getDefault()).equals(logicalFont.getFontName())) {
            PhysicalFont physicalFont = ((CompositeFont) font).getSlotFont(0);
            return new Font(physicalFont.getFamilyName(Locale.getDefault()), physicalFont.getStyle(), logicalFont.getSize());
        }
    }
    return logicalFont;
}

对于(int i=0;iThanks!我在某个地方听说,通常不应该使用这些类(它们是java API的内部构件),但它在较新的java版本中工作得非常好=),您可以使用:Font2D font=FontManagerFactory.getInstance().findFont2D(logicalFont.getName(),0,FontManager.NO_FALLBACK);
public static Font getPhysicalFont(Font logicalFont) {
    for (int i=0; i<FontManager.getRegisteredFonts().length; i++) {
        Font2D font = FontManager.getRegisteredFonts()[i];
        if (font instanceof CompositeFont && font.getFontName(Locale.getDefault()).equals(logicalFont.getFontName())) {
            PhysicalFont physicalFont = ((CompositeFont) font).getSlotFont(0);
            return new Font(physicalFont.getFamilyName(Locale.getDefault()), physicalFont.getStyle(), logicalFont.getSize());
        }
    }
    return logicalFont;
}