如何更改JOptionPane的大小和字体?

9

你能改变JOptionPane中文本的字体和大小吗?我尝试过,只有在特定的Java类上“运行文件”才有效。如果启动整个项目,则不会更改字体。我只想更改特定的JOptionPane而不是全部。

以下是代码:

 UIManager.put("OptionPane.messageFont", new FontUIResource(new Font(  
          "Arial", Font.BOLD, 18)));       
 JOptionPane.showMessageDialog(null,"MESSAGE","ERROR",JOptionPane.WARNING_MESSAGE);         

1
UIManager 中的此键与外观相关。 - mKorbel
@mKorbel,无法简单更改字体吗? - nonickname
看看这个:https://dev59.com/5Gs05IYBdhLWcg3wIOXS - always_a_rookie
4个回答

21

这很容易。JOptionPane不仅接受字符串,还可以接受组件。因此,您可以创建一个标签,设置其字体,并将其用作消息。

JLabel label = new JLabel("MESSAGE");
label.setFont(new Font("Arial", Font.BOLD, 18));
JOptionPane.showMessageDialog(null,label,"ERROR",JOptionPane.WARNING_MESSAGE);

我不明白为什么之前没有人回答这个问题。


我尝试过,但是JLabel label = new JLabel(LONG MESSAGE \n MESSAGE \m hello”)无法换行,而是显示长行文本。 - nonickname
1
@neo999 试试这个代码:JLabel label = new JLabel("<html>长信息 <br> 信息 <br> 你好</html>"); - Sergiy Medvynskyy
如何更改 JOptionPane 标题栏的字体大小? - user3153014
@user3153014 请自己提出新的问题。 - Sergiy Medvynskyy
我有这个问题,我认为它还不错,但不是最好的。我可以使用JLabel,但必须设置适当的换行大小等。如果我使用HTML标记,则必须转义要显示的消息中的文本,我通常使用普通字符串传递消息并在此之后进行转义是不好的。如果我构建一个JTextArea,我必须将背景设置为与默认对话框相同。如果我构建一个JPanel,我必须处理布局。太麻烦了。 - WesternGun

10

我们应该按照以下方式使用:

UIManager.getLookAndFeelDefaults().put("OptionPane.messageFont", new Font("Arial", Font.BOLD, 14)); UIManager.getLookAndFeelDefaults().put("OptionPane.buttonFont", new Font("Arial", Font.PLAIN, 12));

UIManager.put("OptionPane.messageFont", new Font("Arial", Font.BOLD, 14));
UIManager.put("OptionPane.buttonFont", new Font("Arial", Font.PLAIN, 12));

记得在任何JOptionPane对话框出现之前设置它。 我只是将它放在main方法的第一行。

想知道为什么要这样做,可以查看UIManager的文档,这对我们很有用。

默认值

UIManager管理三组UIDefaults。 它们的顺序如下:

开发人员默认值。 除了几个例外情况,Swing不会更改开发人员默认值; 这些旨在由开发人员修改和使用。

外观默认值。 外观默认值由安装为当前外观(调用setLookAndFeel())的外观提供。 外观默认值可使用getLookAndFeelDefaults()方法获得。

系统默认值。 系统默认值由Swing提供。 调用各种get方法会依次检查每个默认值,返回第一个非null值。 例如,调用UIManager.getString(“Table.foreground”)首先检查开发人员默认值。 如果开发人员默认值包含“Table.foreground”的值,则返回该值,否则将检查外观默认值,然后是系统默认值。 重要的是要注意,getDefaults返回带有此解析逻辑的UIDefaults的自定义实例。 例如,UIManager.getDefaults()。 getString(“Table.foreground”)等同于UIManager.getString(“Table.foreground”)。 它们都使用刚才描述的算法进行解析。 在许多地方,文档使用单词默认值来引用具有先前描述的解析逻辑的UIDefaults的自定义实例。

因此,我们应该首先更改开发人员默认值。 方法UIManager.put(Object key, Object value)就是要使用的方法。

public static Object put(Object key, Object value)

将对象存储在开发人员默认值中。 这是getDefaults().put(key,value)的覆盖方法。 这仅影响开发人员默认值,而不影响系统或外观默认值。

参数:

key - 指定检索键的对象

value - 要存储的对象; 有关如何处理null的详细信息,请参阅UIDefaults

返回:UIDefaults.put(java.lang.Object,java.lang.Object)返回的对象

抛出:

NullPointerException - 如果key为null,则会抛出NullPointerException

这正是我要找的:没有额外的面板,不需要覆盖JOptionPane的默认UI的麻烦。

JOptionPane中属性名称的完整列表在此处:

http://www.java2s.com/Tutorial/Java/0240__Swing/CustomizingaJOptionPaneLookandFeel.htm

Property String                                 Object Type

OptionPane.actionMap                            ActionMap
OptionPane.background                           Color
OptionPane.border                               Border
OptionPane.buttonAreaBorder                     Border
OptionPane.buttonClickThreshhold                Integer
OptionPane.buttonFont                           Font
OptionPane.buttonOrientation                    Integer
OptionPane.buttonPadding                        Integer
OptionPane.cancelButtonMnemonic                 String
OptionPane.cancelButtonText                     String
OptionPane.cancelIcon                           Icon
OptionPane.errorDialog.border.background        Color
OptionPane.errorDialog.titlePane.background     Color
OptionPane.errorDialog.titlePane.foreground     Color
OptionPane.errorDialog.titlePane.shadow         Color
OptionPane.errorIcon                            Icon
OptionPane.errorSound                           String
OptionPane.font                                 Font
OptionPane.foreground                           Color
OptionPane.informationIcon                      Icon
OptionPane.informationSound                     String
OptionPane.inputDialogTitle                     String
OptionPane.isYesLast                            Boolean
OptionPane.messageAnchor                        Integer
OptionPane.messageAreaBorder                    Border
OptionPane.messageFont                          Font
OptionPane.messageForeground                    Color
OptionPane.messageDialogTitle                   String
OptionPane.minimumSize                          Dimension
OptionPane.noButtonMnemonic                     String
OptionPane.noButtonText                         String
OptionPane.noIcon                               Icon
OptionPane.okButtonMnemonic                     String
OptionPane.okButtonText                         String
OptionPane.okIcon                               Icon
OptionPane.questionDialog.border.background     Color
OptionPane.questionDialog.titlePane.background  Color
OptionPane.questionDialog.titlePane.foreground  Color
OptionPane.questionDialog.titlePane.shadow      Color
OptionPane.questionIcon                         Icon
OptionPane.questionSound                        String
OptionPane.sameSizeButtons                      Boolean
OptionPane.separatorPadding                     Integer
OptionPane.setButtonMargin                      Boolean
OptionPane.titleText                            String
OptionPane.warningDialog.border.background      Color
OptionPane.warningDialog.titlePane.background   Color
OptionPane.warningDialog.titlePane.foreground   Color
OptionPane.warningDialog.titlePane.shadow       Color
OptionPane.warningIcon                          Icon
OptionPane.warningSound                         String
OptionPane.windowBindings                       Object[ ]
OptionPane.yesButtonMnemonic                    String
OptionPane.yesButtonText                        String
OptionPane.yesIcon                              Icon
OptionPaneUI                                    String

2

有一种简单的方法可以更改 JOptionPane 中的默认字体。传递一个以 html 格式修改的字符串,这意味着您可以使用 <font> 标签甚至 CSS。

使用 <font> 标签。

JOptionPane.showMessageDialog(this, 
        "<html><font face='Calibri' size='15' color='red'>Hello");

font tag

使用CSS。

JOptionPane.showMessageDialog(this, 
        "<html><h1 style='font-family: Calibri; font-size: 36pt;'>Hello");

using css


1
我发现在NIMBUS L&F中最初没有设置“messageFont”(UIManager.get("OptionPane.messageFont") == null)。
因此,如果您想从默认字体/字号派生新字体/字号,则可以使用键“OptionPane.font”(--> UIManager.get("OptionPane.font")),它似乎永远不会返回null。然后使用键“OptionPane.messageFont”设置派生字体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接