7

我指的是这个 Nimbus 参考

我尝试将全局字体设置为稍大:

UIManager.put("defaultFont", new Font(Font.SANS_SERIF, 0, 16));

...仅适用于菜单,但不适用于其他(按钮、标签)。

我试图改变标签和按钮字体

UIManager.put("Button.font", new Font(Font.SANS_SERIF, 0, 16));
UIManager.put("Label.font", new Font(Font.SANS_SERIF, 0, 16));

但字体仍然存在

唯一对我有用的是派生字体:

someButton.setFont(someButton.getFont().deriveFont(16f));

但这不是一个选项,因为这必须手动为每个 元素完成。

请注意,为 UIManager 派生字体也不起作用

UIManager.put("Label.font",
    UIManager.getFont("Label.font").deriveFont(16f));

我在 Linux 和 Windows 下测试了所有内容:相同的行为。

我只是无法理解 API 怎么会如此混乱。如果一个方法被称为 setFont(..) 那么我希望它设置字体。如果此方法在任何可能的情况下都无法设置字体,则应弃用它。

编辑:
这个问题不仅适用于 Nimbus,也适用于默认的 LAF。

4

6 回答 6

8

适用于 JDK6 和 JDK7。复制+粘贴,玩得开心;)

注意:对于 JDK6,更改
javax.swing.plaf.nimbus
com.​sun.​java.​swing.​plaf.​nimbus.

代码

import java.awt.*;
import java.lang.reflect.*;
import javax.swing.*;
import javax.swing.plaf.nimbus.*;

public class Main {

 public static void main(String[] args)
   throws InterruptedException, InvocationTargetException {

  SwingUtilities.invokeAndWait(new Runnable() {

   @Override
   public void run() {
    try {
     UIManager.setLookAndFeel(new NimbusLookAndFeel() {

      @Override
      public UIDefaults getDefaults() {
       UIDefaults ret = super.getDefaults();
       ret.put("defaultFont",
         new Font(Font.MONOSPACED, Font.BOLD, 16)); // supersize me
       return ret;
      }

     });

     new JFrame("Hello") {

      {
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       setLayout(new FlowLayout(FlowLayout.LEFT));

       setSize(500, 500);
       setLocationRelativeTo(null);

       add(new JLabel("someLabel 1"));
       add(new JButton("someButton 1"));
       add(new JLabel("someLabel 2"));
       add(new JButton("someButton 2"));

       setVisible(true);
      }

     };     
    } catch (Exception ex) {
     throw new Error(ex);
    }
   }

  });
 }

}
于 2010-04-04T23:16:54.527 回答
5

nimbus 默认值是惰性创建的,因此在绘制屏幕之前设置 'defaultFont' 会将字体添加到父默认值,而不是 nimbus 默认值。

解决方法:强制 nimbus 初始化默认值,然后设置默认值:

NimbusLookAndFeel laf = new NimbusLookAndFeel();
UIManager.setLookAndFeel(laf);
laf.getDefaults().put("defaultFont", new Font("Monospaced", Font.BOLD, 12));

注意:此代码比上面建议的覆盖 getDefaults() 更有效。

于 2011-10-06T09:37:57.117 回答
1

用FontUIResource包裹你的字体。UIManager 颜色和 ColorUIResource 解决了所有问题,我遇到了完全相同的问题。在不深入研究 JDK 的情况下,我认为组件在某些地方期望(阅读:通过 instanceof 检查)UIResources(也许有人可以确认这一点)

于 2009-06-04T12:57:47.890 回答
1

至今令我惊讶的一件事是 LaF 设置器 [setFont、setBackground 等] 实际上并没有设置真实属性。规范说 LaF 可以忽略用户设置的字体、颜色等。这就是 GTKLaF 完全被破坏的原因。它使用系统 gtk 主题设置,而不是程序员的设置。IIRC Nimbus 有一个单独的包私有类,其中包含默认值(NimbusDefaults?)并且不容易访问。

如果您打算以任何方式自定义外观,我建议永远不要使用 GTK 或 Nimbus LAF。

一个快速的谷歌搜索为 GTK出现了这个

可以在此处找到有关 nimbus 中这些问题的讨论。

于 2009-06-04T12:48:47.737 回答
1

一行代码中的答案(假设您已经设置了 Nimbus LaF):

UIManager.getLookAndFeelDefaults().put("defaultFont", new Font(Font.SANS_SERIF, 0, 20));

当然,您需要在创建任何 GUI 组件之前调用它,即在设置 Nimbus LaF 之后就在您的 main 中。

于 2013-04-18T08:07:55.773 回答
0

Java LAF API 有点笨拙,但没有什么比检查源代码来获得答案更好的了。

请注意,MetalLookAndFeel 和 Nimbus 是不同的实现,每个的属性不必相同。

以下示例使用 MetalLookAndFeel。

package com.stackoverflow.laf.font;

import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class SetFontExample {

  public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
      @Override public void run() {
        UIManager.put("Label.font", new Font(Font.SANS_SERIF, 0, 20));
        try {
          UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) {
          e.printStackTrace();
        }

        JFrame frame = new JFrame("Set font example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JLabel("Font test"));
        frame.pack();
        frame.setVisible(true);
      }
    });
  }
}

这是因为 Metal 上存在属性“Label.font”并且它正确使用了该属性。

你可以这样检查:

package com.stackoverflow.laf;

import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;

public class ListLAFUIDefaults {

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override public void run() {
        try {
          // Choose LAF
          UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) {
          e.printStackTrace();
        }
        UIDefaults defaults = UIManager.getLookAndFeel().getDefaults();
        System.out.println(defaults);

        // Check a property
        String propertyKey = "defaultFont";
        System.out.println(UIManager.getLookAndFeel().getName() +
            (defaults.containsKey(propertyKey) ? " contains " : " doesn't contain ") +
            "property " + propertyKey);
      }
    });
  }
}
于 2009-06-04T10:59:50.297 回答