Java Swing其他应用程序的最小(或范围)字体大小

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应用程序-源代码从松鼠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()));

好问题 +1 - mKorbel
移除标签“Nimbus”。这与主题“Nimbus”无关,它只是一个例子。它涉及所有主题。 - peenut
在Swing中,有外观和感觉,而不是主题。 - mKorbel
是的,但我更喜欢“主题”这个词,我在原帖中包括了所有名称“主题/L&F(外观和感觉)”。无论如何,您显然已经理解了我的评论,只用了“主题”这个词。 - peenut
1
仅略带相关:通常情况下,应用程序应该尊重用户的字体设置(而不是通过 dpi 计算大小等方式进行猜测)。不幸的是,在这方面 Swing 的表现并不太好。 - kleopatra
显示剩余2条评论
2个回答

1

与其更改字体,Nimbus为小型、小型、常规和大型组件提供了一个sizeVariant。本文有更多示例:调整组件大小

myButton.putClientProperty("JComponent.sizeVariant", "mini");

0
在我的Swing应用程序中,我所做的是包括一个字体类。每个需要字体的其他Swing组件都会调用这个字体类。
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);
    }

}

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

您可以为每个所需的字体大小定义一个方法,可能称为小号、中号和大号,以便稍后可以更改方法以使用不同的点大小或类型。

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


我在我的问题中描述了你的解决方案不令人满意:请看加粗的“比率”部分。我想知道是否可以更好地完成 - 共享Java应用程序之间的设置(如“外观和感觉”),和/或如何为使用绝对字体大小而非比例字体大小的现有Java应用程序修复它。 - peenut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接