我正在使用字体作为数据。这些字体采用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();
}
结果如下:
这意味着SWT无法将字体识别为Times New Roman。可能它被Arial
分散了注意力,默认情况下它位于系统中,默认为Arial
。
更新3
档案样本:https://drive.google.com/file/d/0B1jZw9H7L4gmTjUwYURhU0lkeGM/edit?usp=sharing
答案 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();
}