6

对于 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 应用程序 - 从 squirrel 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);

在我尝试一些丑陋的 hack 之前值得一问,比如用自定义组件替换 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;

这个值只能由非常高级的用户编辑(例如在 JAVA_HOME/lib/rt.jar 中使用名为“rej”的程序编辑常量池)——我试过了,它工作,但它并不总是工作,因为他们实际上在几个地方硬编码(!!)常量(这真的是最好的质量 - 标准库吗?),例如:

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()));
4

2 回答 2

1

FontNimbus 没有更改 ,而是有一个sizeVariant用于迷你、小型、常规和大型组件。本文有更多示例:调整组件大小

myButton.putClientProperty("JComponent.sizeVariant", "mini");
于 2012-12-26T15:57:27.570 回答
0

我在 Swing 应用程序中所做的是包含一个 Font 类。每个其他需要字体的 Swing 组件都会调用 Font 类。

import java.awt.Font;

public class MinesweeperFont {

    protected static final String FONT_NAME = "Comic Sans MS";

    public static Font getBoldFont(int pointSize) {
        return new Font(FONT_NAME, Font.BOLD, pointSize);
    }

}

现在在这种情况下,我只需要一种字体类型。我让应用程序选择字体大小。

您可以为所需的每种字体大小定义一个方法,可能将它们称为小号、中号和大号,因此您可以稍后根据需要更改这些方法以使用不同的磅值或类型。

由于您的整个应用程序都调用了这些字体静态方法,因此您只需在一处进行字体更改。

于 2012-12-26T14:07:11.750 回答