Java:改变UI字体(Nimbus)不起作用!

iva*_*off 6 java user-interface fonts swing nimbus

我指的是这个Nimbus参考.

我试图将全局字体设置得略大一些:

UIManager.put("defaultFont", new Font(Font.SANS_SERIF, 0, 16));
Run Code Online (Sandbox Code Playgroud)

...仅适用于菜单,但没有其他功能(按钮,标签).

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

UIManager.put("Button.font", new Font(Font.SANS_SERIF, 0, 16));
UIManager.put("Label.font", new Font(Font.SANS_SERIF, 0, 16));
Run Code Online (Sandbox Code Playgroud)

但字体仍然存在.

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

someButton.setFont(someButton.getFont().deriveFont(16f));
Run Code Online (Sandbox Code Playgroud)

但这不是一个选项,因为必须 手动为每个元素执行此操作.

注意,为UIManager导出字体也不起作用:

UIManager.put("Label.font",
    UIManager.getFont("Label.font").deriveFont(16f));
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:
问题不仅适用于Nimbus,还适用于默认的LAF.

jav*_*top 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);
    }
   }

  });
 }

}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,在我发现的所有提示中,这是唯一可以解决 Nimbus 错误的提示。 (2认同)

小智 5

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

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

NimbusLookAndFeel laf = new NimbusLookAndFeel();
UIManager.setLookAndFeel(laf);
laf.getDefaults().put("defaultFont", new Font("Monospaced", Font.BOLD, 12));
Run Code Online (Sandbox Code Playgroud)

注意:此代码比覆盖 getDefaults() 更有效,如上所述。