对于Swing应用程序,组件的默认字体设置在当前主题中,并且可以使用UIManager检索:
public class JavaTesting {
public static void main(String[] args) {
System.out.println(UIManager.get("Label.font"));
}
}
这可以在JAVA_HOME/lib/swing.properties中进行调整,例如为一系列应用程序设置:
swing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel
或在命令行中使用以下命令设置:
java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
或者应用程序本身记住了它的外观和感觉,并将该值存储在配置(文件)中。这种方法有效,因为应用程序可以为自己设置外观和感觉,例如:
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
这看起来很不错,但应用程序经常需要较小的字体(例如标签的不重要状态栏消息)或更大的字体(带有某个标题的标签)。是否有任何推荐的方法? 作为高密度监视器的用户,我不得不丢弃许多使用像这样的代码的Java应用程序-源代码从松鼠SQL复制:
Font tmp = (Font)UIManager.get("Label.font");
if (tmp != null) {
Font font = tmp.deriveFont(10.0f);
_statusBarFontInfo = new FontInfo(font);
}
这个示例代码会使状态栏变得完全无法阅读,但大多数组件都已调整为新的更大字体。对于创建自己的应用程序,可能会使用一些比例(例如主题字体的50%至150%),但硬编码0.50-1.50范围看起来也是一个不好的编码习惯。并且它不能解决我没有源代码的应用程序的问题。这属于主题/L&F(外观和感觉)。示例:
FontUIResource Label_font_resource = (FontUIResource)javax.swing.UIManager.get("Label.font");
Font Label_font = Label_font_resource;
Font Label_font_bigger = Label_font.deriveFont(Label_font.getSize2D() * 1.5f);
在我尝试一些丑陋的技巧(如替换swing默认组件,或调整Graphics2D.setFont等其他可怕的东西)之前,值得询问一下。
编辑:唯一存在的是大小变体,仅由Nimbus主题支持。允许的值为"mini"、"small"、"regular"、"large"。例如:
JComponent mini = new JButton("mini");
mini.putClientProperty("JComponent.sizeVariant", "mini");
然而,查看Nimbus主题的源代码后,无法简单地调整这些值(例如将“大”缩放到150%),实际上是硬编码的!
package javax.swing.plaf.nimbus;
public final class NimbusStyle extends SynthStyle
{
public static final String LARGE_KEY = "large";
public static final String SMALL_KEY = "small";
public static final String MINI_KEY = "mini";
public static final double LARGE_SCALE = 1.15D;
public static final double SMALL_SCALE = 0.857D;
public static final double MINI_SCALE = 0.714D;
只有非常高级的用户才能编辑此值(例如使用名为“rej”的程序编辑JAVA_HOME/lib/rt.jar中的常量池)- 我尝试过,它可以运行,但并不总是有效,因为它们实际上在几个地方硬编码了常量(这真是最好的质量标准库吗?),例如:
if ("large".equals(str))
{
this.scrollBarWidth = (int)(this.scrollBarWidth * 1.15D);
this.incrGap = (int)(this.incrGap * 1.15D);
this.decrGap = (int)(this.decrGap * 1.15D);
}
底线是:目前Java外观不支持此功能。我建议使用比例,例如默认字体大小的0.7-1.3倍。
JLabel smallLabel = new JLabel("some text");
smallLabel.setFont(smallLabel.getFont().deriveFont(0.8f * smallLabel.getFont().getSize2D()));