首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:改变UI字体(Nimbus)是行不通的!

Java:改变UI字体(Nimbus)是行不通的!
EN

Stack Overflow用户
提问于 2009-06-04 08:54:08
回答 6查看 10K关注 0票数 7

我指的是这个Nimbus引用

我试图将全局字体设置为稍微大一点:

代码语言:javascript
运行
复制
UIManager.put("defaultFont", new Font(Font.SANS_SERIF, 0, 16));

...works只适用于菜单,但nothing (按钮、标签)。

我试着用

代码语言:javascript
运行
复制
UIManager.put("Button.font", new Font(Font.SANS_SERIF, 0, 16));
UIManager.put("Label.font", new Font(Font.SANS_SERIF, 0, 16));

但是字体仍然是

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

代码语言:javascript
运行
复制
someButton.setFont(someButton.getFont().deriveFont(16f));

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

请注意,为UIManager 派生字体也不适用于

代码语言:javascript
运行
复制
UIManager.put("Label.font",
    UIManager.getFont("Label.font").deriveFont(16f));

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

我只是不明白为什么API会如此混乱。如果一个方法被称为setFont(..)然后,,我希望它的设置字体。如果此方法无法在任何可想象的情况下设置字体,则应取消该方法。

编辑:

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-04-04 23:16:54

这个与JDK6和JDK7一起工作。Copy+paste并玩得开心;)

注意:对于JDK6,更改

javax.swing.plaf.nimbus to

com.​sun.​java.​swing.​plaf.​nimbus

代码

代码语言:javascript
运行
复制
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);
    }
   }

  });
 }

}
票数 7
EN

Stack Overflow用户

发布于 2011-10-06 09:37:57

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

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

代码语言:javascript
运行
复制
NimbusLookAndFeel laf = new NimbusLookAndFeel();
UIManager.setLookAndFeel(laf);
laf.getDefaults().put("defaultFont", new Font("Monospaced", Font.BOLD, 12));

注意:正如上面所建议的,这段代码比重写getDefaults()更有效。

票数 6
EN

Stack Overflow用户

发布于 2009-06-04 12:48:47

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

我建议不要使用GTK或Nimbus LAF,如果您计划以任何方式定制外观。

一个快速的google搜索显示了的GTK

这里中可以找到对这些问题的讨论。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/949353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档