更新済み - 問題は今や醜い方法で解決されていますが、それを行うには適切な方法が必要ですか?フォントがシステムフォントと衝突するとJava JLabelのHTML表示が文字化けする
カスタムフォントのテキストをレンダリングする際に、JLabel のHTML形式で、フォント名がシステムに既にインストールされているフォントの名前と矛盾するときに問題が発生しています。
システムフォントは異なる形式(otf対ttf)ですので、当然テキストが文字化けしています。
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont
を呼び出すと、フォントの登録に失敗したことを示すfalseが返されます。だから、私は疑問に思う、登録する前にこのフォントを使用する方法、または登録する前に名前を変更する方法はありますか?
私はttfファイルを編集してフォント名をマングルすることで問題を解決しましたが、矛盾を起こす可能性はほとんどありませんが、この状況を処理する適切な方法があるはずです。
package test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.JApplet;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
class MyComponent extends JPanel {
Font font; String text;
public MyComponent(Font f) {font=f;}
public void initSwing()
{
final String labelcontents = "<html><center>foo</center></html>";
System.out.println(labelcontents);
JLabel text = new JLabel(labelcontents);
text.setFont(font);
add(text,BorderLayout.CENTER);
}
}
@SuppressWarnings("serial")
public class TestApplet extends JApplet {
public void init()
{
Font mainFont = null;
InputStream is = getClass().getResourceAsStream("fonts/Exo-Bold.ttf");
try {
mainFont = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(24f);
System.out.println(mainFont.getName());
boolean registered=GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(mainFont);
System.out.println("registered "+registered);
} catch (FontFormatException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
final Container fframe = (JComponent)(getContentPane());
final MyComponent component = new MyComponent(mainFont);
Thread t = new Thread(new Runnable() {
public void run() { try {
SwingUtilities.invokeAndWait(new Runnable() {public void run() {
fframe.add(component);
component.initSwing();
fframe.revalidate();
fframe.repaint();
}});
} catch (Exception e) {
e.printStackTrace();
} }
});
t.start();
}
}
上記のコードで使用されるエキソ太字フォントができます - - たとえば、HTTPからダウンロードすること。 com/d/5755/exo.zip? –
私はそのソースを今は思い出しませんが、無料のフォントコレクションからのものでした –
おそらくあなたのフォントファイルを共有できましたか?既定のフォントで同じ問題が発生していますか? –