首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Font在不同的jres上加载不同?

为什么Font在不同的jres上加载不同?
EN

Stack Overflow用户
提问于 2013-06-12 07:31:51
回答 2查看 1K关注 0票数 1

我正在尝试将字体加载到用java1.4编写的swing应用程序的标签/按钮文本中。由于某些原因,字体毫无例外地加载,但在按钮上显示一个完全不同的字体。当我在1.5jre上运行相同的代码时,它似乎正常工作。这一切为什么要发生?

UPDATE打印1.4,1.5上的系统显示如下:

java.awt.Fontfamily=Futura LT,name=Futura LT培养基,style=bold,size=14

JRE1.4: java.awt.Fontfamily=dialog,name=Futura LT培养基,style=bold,size=14

字体名称家族是不同的!为什么会这样呢?

下面是一张图片,显示它在diff jres上的外观(左1.5,右1.4)

代码

代码语言:javascript
复制
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.FontFormatException;
import java.io.IOException;
import java.io.InputStream;

import javax.swing.JButton;
import javax.swing.SwingUtilities;

import org.jdesktop.swingx.MultiSplitLayout;
import org.jdesktop.swingx.MultiSplitPane;
import org.jdesktop.swingx.MultiSplitLayout.Node;



/**
 * 
 * @author Hans Muller (Hans.Muller@Sun.COM)
 */
public class Example2 extends Example {
    protected void initialize(String[] ignore) {
        super.initialize(ignore);

        String layoutDef = "(COLUMN (LEAF name=column1 weight=0.25) (LEAF name=column2 weight=0.25) (LEAF name=column3 weight=0.25) (LEAF name=column4 weight=0.25) )";
        Node modelRoot = MultiSplitLayout.parseModel(layoutDef);

        MultiSplitPane multiSplitPane = new MultiSplitPane();
        multiSplitPane.setDividerSize(5);
        multiSplitPane.getMultiSplitLayout().setModel(modelRoot);
        JButton comp = new JButton("TEST TEXT");
        comp.setFont(loadFont("FuturaLT.ttf",14,Font.BOLD));
        multiSplitPane.add(comp, "column1");
        multiSplitPane.add(new JButton("Test Text"), "column2");
        Container cp = mainFrame.getContentPane();
        cp.add(multiSplitPane, BorderLayout.CENTER);
    }

    private static Font loadFont(String fontName, float size, int style) {

        InputStream openStream = FontColorScheme.class
                .getResourceAsStream("resources/fonts/FuturaLT/"
                        + fontName);
        ;
        try {
            Font font = Font.createFont(Font.TRUETYPE_FONT, openStream);
            Font finalFont = font.deriveFont((float) size).deriveFont(style);
            System.out.println("Loading font " + fontName + " " + finalFont);
            return finalFont;
        } catch (FontFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (openStream != null) {
                try {
                    openStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    public static void main(final String[] args) {
        System.setProperty("awt.useSystemAAFontSettings", "off");
        Runnable doCreateAndShowGUI = new Runnable() {
            public void run() {
                try {
                    Example2 app = new Example2();
                    app.initialize(args);
                    app.show();
                } catch (Exception e) {
                    // TBD log an error
                }
            }
        };
        SwingUtilities.invokeLater(doCreateAndShowGUI);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2013-06-12 07:57:33

渲染是正确的,有三个方面

票数 2
EN

Stack Overflow用户

发布于 2013-06-12 07:38:53

这可能有很多原因。为了更好地理解这一点,您应该打印Java正在使用的字体:

代码语言:javascript
复制
 System.out.println(button.getFont().toString());

这就回答了两个JRE是否使用相同的默认字体的问题。如果是这样的话,确保字体是TrueType字体,而不是位图字体;位图字体不能很好地缩放。虽然TTF的比例尺更好,但某些字体在某些尺寸上看起来不太好。因此,字体在10像素和12像素时看上去很好,但在11像素时看起来很奇怪。

若要解决此问题,请自行设置字体,如果已覆盖系统默认设置,则选择不同的字体,或尝试调整字体大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17059967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档