如何将AWT字体转换为SWT字体? SWT不完整性:无法使用文件中的字体名称

时间:2014-01-21 00:04:44

标签: java fonts awt swt type-conversion

我正在使用字体作为数据。这些字体采用AWT格式。我想在我的eclipse应用程序中的TableView中有一个字体示例。不幸的是,SWT拥有自己的Font类。它与AWT有何关系?是否可以将一种字体转换为另一种字体?

我的AWT字体是从TTF文件中获取的,代码为

in = getClass().getResourceAsStream(fileNames[i]);
font = Font.createFont(Font.TRUETYPE_FONT, in).deriveFont(FontSize);

字体必须与文件完全相同。

更新

不可思议!看起来像SWT作者想象自己很酷,可以创建自己的,分开的Font实现,因此唯一的对应关系是文件。但他们的手颤抖着,他们忘了实施字体名称!

更新2

我准备了TTF文件,实际上是Times New Roman字体,但其中所有名称都更改为Arial。我将此文件命名为arial_actuallytimes.ttf

我运行了以下程序

  public static void main(String[] args) throws FontFormatException, IOException
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));

        // The font file
        File fontFile = new File("arial_actuallytimes.ttf");
        // Get the font name from AWT
        Font awtFont = Font.createFont(Font.TRUETYPE_FONT, fontFile).deriveFont(12f);
        String fontName = awtFont.getFontName();
        shell.setText(fontName);

        // Load the font in SWT
        display.loadFont(fontFile.getAbsolutePath());

        // Get the font instance with the name we got from AWT
        final org.eclipse.swt.graphics.Font swtFont = new org.eclipse.swt.graphics.Font(display, fontName, 12, SWT.NORMAL);

        // Use the font
        Label label = new Label(shell, SWT.BORDER);
        label.setFont(swtFont);
        label.setText("The quick brown fox jumps over the lazy dog");
        label.addListener(SWT.Dispose, new Listener()
        {
            @Override
            public void handleEvent(Event arg0)
            {
                swtFont.dispose();
            }
        });

        Composite frameHolder = new Composite(shell, SWT.EMBEDDED);
        frameHolder.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        //frameHolder.setLayout(new FillLayout());

        JLabel jLabel = new JLabel("The quick brown fox jumps over the lazy dog");
        jLabel.setFont(awtFont);

        JPanel jPanel = new JPanel(new BorderLayout());
        jPanel.add(jLabel, BorderLayout.CENTER);

        Frame frame = SWT_AWT.new_Frame(frameHolder);
        frame.setLayout(new BorderLayout());
        frame.add(jPanel);
        frame.pack();

        shell.pack();
        shell.open();

        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

结果如下:

enter image description here

这意味着SWT无法将字体识别为Times New Roman。可能它被Arial分散了注意力,默认情况下它位于系统中,默认为Arial

更新3

档案样本:https://drive.google.com/file/d/0B1jZw9H7L4gmTjUwYURhU0lkeGM/edit?usp=sharing

2 个答案:

答案 0 :(得分:1)

您可以使用

Device.loadFont(file path);

加载字体 - 这需要文件路径而不是资源流。

然后你会使用

new Font(device, "font name", height, style);

创建SWT字体。

答案 1 :(得分:1)

根据@ greg-449的回答,我提出了这个问题。所有缺少的是获取字体名称的方法:

public static void main(String[] args) throws FontFormatException, IOException
{
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    // The font file
    File fontFile = new File("DIN.ttf");
    // Get the font name from AWT
    String fontName = Font.createFont(Font.TRUETYPE_FONT, fontFile).deriveFont(12).getFontName();

    // Load the font in SWT
    display.loadFont(fontFile.getAbsolutePath());

    // Get the font instance with the name we got from AWT
    final org.eclipse.swt.graphics.Font swtFont = new org.eclipse.swt.graphics.Font(display, fontName, 12, SWT.NORMAL);

    // Use the font
    Text text = new Text(shell, SWT.BORDER);
    text.setFont(swtFont);
    text.addListener(SWT.Dispose, new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            swtFont.dispose();
        }
    });

    shell.pack();
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}