【问题标题】:How to change the font in JOptionPane.showInputDialog JTextField?如何更改 JOptionPane.showInputDialog JTextField 中的字体?
【发布时间】:2013-06-08 05:10:40
【问题描述】:

我需要知道为使JTextFieldJOptionPane.showInputDialog 窗口中的字体发生更改需要设置的ui 管理器属性。

【问题讨论】:

  • 请编辑您的问题,以阐明建议的答案如何不符合您的要求。

标签: java swing fonts jtextfield joptionpane


【解决方案1】:

我相信你想要TextField.font。这将为当前安装的外观返回所有JTextFields 默认使用的字体...

更好的解决方案可能是提供您自己的JTextField,并使用您要使用的字体进行设置。

例如...

(抱歉,更新了,使用了错误的对话框:P)

import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestOptionPane09 {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JTextField field = new JTextField("Hello");
                field.setFont(field.getFont().deriveFont(Font.BOLD, 24));
                String[] options = {"Ok", "Cancel"};
                int result = JOptionPane.showOptionDialog(
                        null,
                        field,
                        "Help",
                        JOptionPane.OK_CANCEL_OPTION,
                        JOptionPane.QUESTION_MESSAGE,
                        null,
                        options,
                        0);
                switch (result) {
                    case 0:
                        System.out.println("Okay");
                        break;
                    case 1:
                        System.out.println("Cancel");
                        break;
                }
            }
        });
    }
}

【讨论】:

  • 感谢您的解决方案。但这不是我有兴趣在我的应用程序兄弟中构建的情况。谢谢你...
  • 那你想达到什么目的?
  • “你想达到什么目的?” 我猜想(但如果 OP 可以确认会有所帮助)他们想要一个外观和行为都与实际相同的对话框标准输入对话框(换句话说,“消息”->“输入”,具有? 图标,具有确定/取消按钮)。请参阅我的屏幕截图答案。
  • 我现在正在使用自动驾驶仪,我的意思是使用输入对话框:P
  • case 0: 不是更清楚JOptionPane.OK_OPTION吗?
【解决方案2】:

一个技巧是让确认对话框看起来像一个输入对话框。请注意,此示例与标准输入对话框的行为仍然不同,因为默认情况下未选择输入字段。为此,我一直认为Dialog Focus 上这篇文章中的提示非常宝贵。

下图显示了标准输入对话框与使用大字体的确认对话框的对比。

import java.awt.*;
import javax.swing.*;

class BigInputOptionPane {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                String s = JOptionPane.showInputDialog(null);
                if (s!=null) {
                    System.out.println("User chose: " + s);
                } else {
                    System.out.println("User did not chose an option!");
                }

                JTextField tf = new JTextField(8);
                tf.setFont(tf.getFont().deriveFont(26f));
                int result = JOptionPane.showConfirmDialog(
                        null, tf, "Input", 
                        JOptionPane.OK_CANCEL_OPTION);
                if (result==JOptionPane.OK_OPTION) {
                    System.out.println("User chose: " + tf.getText());
                } else {
                    System.out.println("User did not chose an option!");
                }
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

    【解决方案3】:

    这对我来说可以更改 JOptionPane 中文本和按钮的字体:
    字体 font = new Font(Font.SANS_SERIF, Font.PLAIN, 20);
    UIManager.put("OptionPane.messageFont", 字体);
    UIManager.put("OptionPane.buttonFont", 字体);

    【讨论】:

    • 解释为什么您的解决方案有效会很有帮助。
    【解决方案4】:

    这是我们应该使用的方式:

    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 方法都会导致检查每个默认值,按顺序返回第一个非空值。例如,调用 UIManager.getString("Table.foreground") 会导致首先检查开发人员默认设置。如果开发人员默认值包含“Table.foreground”的值,则返回它,否则检查外观默认值,然后检查系统默认值。 请务必注意,getDefaults 返回 UIDefaults 的自定义实例,其中内置了此解析逻辑。例如,UIManager.getDefaults().getString("Table.foreground") 等价于 UIManager.getString("Table.foreground")。两者都使用刚刚描述的算法解决。在许多地方,文档使用单词 defaults 来指代 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)返回的Object

    投掷:

    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
    

    【讨论】:

    • 谢谢@FaithReaper 就是这样!
    【解决方案5】:

    这就是我在 2018 年 8 月使用 Java 1.8.0_181 使字体更大,从而在我的 4K 笔记本电脑显示器上更具可读性的方法。在调用如下对话框之前,我在 main 顶部附近调用它:

    String menuChoice = JOptionPane.showInputDialog(null, "some prompt", "Menu", JOptionPane.INFORMATION_MESSAGE);
    

    这与之前的答案非常接近,但略有不同,因为它包含了我在之前的回复中没有看到的设置:

    /**
     * Changes the font size used in JOptionPane.showInputDialogs to make them more ADA
     * section 508 compliant by making the text size larger,
     * which is very nice for older people and anyone else with vision problems.
     */
    private static void makeDialogsEasierToSee() {      
    
        // This next one is very strange; but, without it,
        // any subsequent attempt to set InternalFrame.titleFont will
        // be ignored, so resist the temptation to remove it.
        JDialog.setDefaultLookAndFeelDecorated(true);
    
        Font normalFont = new Font(Font.MONOSPACED, Font.PLAIN, 24);
        Font boldFont = normalFont.deriveFont(Font.BOLD);
    
        UIManager.put("OptionPane.font", normalFont);
        UIManager.put("OptionPane.messageFont", normalFont);
        UIManager.put("OptionPane.buttonFont", normalFont);
        UIManager.put("TextField.font", normalFont);
        UIManager.put("InternalFrame.titleFont", boldFont);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2012-12-26
      • 2013-06-20
      • 2011-06-27
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多