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

pee*_*nut 6 java fonts swing themes nimbus

对于swing应用程序,组件的默认字体设置是当前主题,可以使用UIManager检索:

public class JavaTesting {
    public static void main(String[] args) {
        System.out.println(UIManager.get("Label.font"));
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以在JAVA_HOME/lib/swing.properties中针对应用程序范围进行调整,例如:

swing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel
Run Code Online (Sandbox Code Playgroud)

或者在命令行设置:

java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
Run Code Online (Sandbox Code Playgroud)

或者应用程序本身会记住它的外观和感觉,并将此值存储在配置(文件)中的某个位置.它可以工作,因为应用程序可以为自己设置外观,例如:

UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");      
Run Code Online (Sandbox Code Playgroud)

这一切看起来都不错,但应用程序通常需要较小的字体(例如Label的不重要状态栏消息)或较大的字体(带有一些标题的Label).有没有推荐的方法呢? 作为高密度监视器的用户,我不得不丢弃许多java应用程序,使用这样的代码 - 从squirrel sql复制的源代码:

Font tmp = (Font)UIManager.get("Label.font");
if (tmp != null) {
        Font font = tmp.deriveFont(10.0f);
        _statusBarFontInfo = new FontInfo(font);
}
Run Code Online (Sandbox Code Playgroud)

此示例代码使状态栏完全不可读,但大多数组件都调整为新的,更大的字体.

为了创建我自己的应用程序,我可能会使用一些比例(例如主题字体的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);
Run Code Online (Sandbox Code Playgroud)

在我尝试一些丑陋的黑客之前,这是值得问的,比如自定义组件取代了swing默认值,或者Graphics2D.setFont调整,或任何其他可怕的东西.:-)

编辑:唯一存在的是尺寸变体,仅受Nimbus主题支持.允许的值为"迷你","小","常规","大".例:

JComponent mini = new JButton("mini");
mini.putClientProperty("JComponent.sizeVariant", "mini");
Run Code Online (Sandbox Code Playgroud)

但是,在查看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;
Run Code Online (Sandbox Code Playgroud)

这个值只能由非常高级的用户编辑(例如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);
}
Run Code Online (Sandbox Code Playgroud)

底线:不,Java外观暂时不支持.我建议使用比率,例如0.7 - 1.3的默认字体大小.

JLabel smallLabel = new JLabel("some text");
smallLabel.setFont(smallLabel.getFont().deriveFont(0.8f * smallLabel.getFont().getSize2D()));
Run Code Online (Sandbox Code Playgroud)

Cat*_*and 1

Nimbus没有更改Font,而是为迷你、小型、常规和大型组件提供了sizeVariant。本文有更多示例:调整组件大小

myButton.putClientProperty("JComponent.sizeVariant", "mini");
Run Code Online (Sandbox Code Playgroud)