5

由于默认LookAndFeel中的字体太小,我使用了几行代码将其设置为Nimbus,并且我的JOptionPane显示大小不同的YesNo按钮。 Yes仍然很小,而No设置为我指定的大小。任何人都知道为什么或如何解决它?

public static void setUIFont(Font a){
    FontUIResource ax=new FontUIResource(a);
    javax.swing.UIManager.put("OptionPane.messageFont", ax);
    javax.swing.UIManager.put("OptionPane.buttonFont", ax);
    javax.swing.UIManager.put("OptionPane.Font", ax);
    javax.swing.UIManager.put("InternalFrame.titleFont", ax);
    javax.swing.UIManager.put("TextField.font", ax);
    javax.swing.UIManager.put("ComboBox.font", ax);
}

...

UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 

class UseNimBus extends SwingInvoker{
    public void run(){
        JDialog.setDefaultLookAndFeelDecorated(true);
        setUIFont(new FontUIResource(new Font(ufont, Font.PLAIN, 20)));
    }
}
(new UseNimBus()).execute();// just invokeLater()

以下行显示了选项窗格,但它具有不同大小的YesNo。这是正常的还是只是我的问题?

inputValuex=JOptionPane.showConfirmDialog(
    myWin, "Are you exiting?", "You clicked X", JOptionPane.YES_NO_OPTION);

更新

还是行不通。我尝试使用代码

javax.swing.UIManager.put("OptionPane.isYesLast", true);

更改“是”按钮的位置,但没有任何效果。我只是想看看如何设置这些值,例如布尔值。

另外,我什至列出了所有UIManager.getDefaults()包含optionpanebutton的键,它们的字体大小都设置为 20。Yes按钮仍然是较小的字体。

4

2 回答 2

4

看起来没有为 optionPane 中创建的第一个按钮采用自定义字体的原因是它被设置为 rootPane 的 defaultButton。因此,它有一个特殊状态 [Default] 用于查找属性 - 如果按钮的设置字体是 UIResource 类型。

所以会发生什么

  • OptionPaneUI 将其创建的所有按钮的字体设置为它在 UIManager 中为“OptionPane.buttonFont”找到的字体
  • SynthButtonUI 忽略状态 [Default] 的按钮字体,因为它是 UIResource

出于某种我不知道的原因(但请记住,在 Nimbus 中,命名/子组件的查找被破坏了),下面的设置都没有任何效果

UIManager.put("\"OptionPane.button\"[Default].font", ax);
UIManager.put("OptionPane:\"OptionPane.button\"[Default].font", ax);

此外,第二个按钮的自定义字体在将其设置为 UIResource 时会在翻转/聚焦时丢失。一种解决方法是将其设置为 UIResource,即

public static void setUIFont(Font a){
    // force usage of the button's font as set by optionPaneUI
    // by _not_ making it a uiResource
    UIManager.put("OptionPane.buttonFont", a);
    // use uiResource for others
    FontUIResource ax=new FontUIResource(a);
    UIManager.put("OptionPane.messageFont", ax);
    ...
}

通常,不是最好的想法。但是我们可能会在这里侥幸成功,因为按钮是在每次调用 JOptionPane.create 时创建的,对单个实例没有持久影响。

于 2013-03-20T11:12:38.467 回答
4

的字体JButton实际上来自Button.font属性。

如果我将此添加到您的属性列表中,它会起作用。

javax.swing.UIManager.put("Button.font", ax);

为什么你会得到两种不同的尺寸,虽然很有趣,但此刻我无法理解。

于 2013-03-19T02:30:26.130 回答