我正在尝试将字体加载到用java 1.4编写的swing应用程序上的标签/按钮文本。 出于某种原因,字体加载无例外,但在按钮上显示完全不同的字体。 当我在1.5 jre上运行相同的代码时,它似乎工作正常。为什么会这样?
更新 在1.4,1.5上打印sysout显示:
jre 1.5:java.awt.Font [family = Futura LT,name = Futura LT Medium,style = bold,size = 14]
jre 1.4:java.awt.Font [family = dialog,name = Futura LT Medium,style = bold,size = 14]
字体名称系列不同!那是为什么?
下面是它在diff jres上看起来的图像(左边是1.5,右边是1.4)
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);
}
}
答案 0 :(得分:2)
渲染是正确的,有三个区域
Font
使用LookAndFeel
(Metal
和Windows
)
Font
和NativeOS,more in question by @kleopatra about Win7, everything depends of theme and setting for Font, rendering, areo ....,懒得在Win8中测试
Java2d
中{li> Graphics(2D)
,Java1.4.xxx
,核心发生了变化,因为Java1.5.xxx
中汇编的输出与今天的Java6/7
非常相似/ p>
答案 1 :(得分:1)
这可能有很多原因。要更好地理解这一点,您应该打印Java正在使用的字体:
System.out.println(button.getFont().toString());
这应该回答两个JRE是否使用相同的默认字体的问题。如果是这样,请确保字体是TrueType字体(TTF)而不是位图字体;位图字体不能很好地扩展。虽然TTF确实更好地扩展,但某些字体在某些尺寸上看起来很糟糕。因此,字体在10和12像素处可能看起来很好,但在11处看起来很奇怪。
要解决此问题,请自行设置字体,如果已覆盖系统默认值,请选择其他字体或尝试调整字体大小。