我需要知道需要设置的 ui 管理器属性以更改JTextField
inJOptionPane.showInputDialog
窗口的字体。
5 回答
一个技巧是让确认对话框看起来像一个输入对话框。请注意,此示例与标准输入对话框的行为仍然不同,因为默认情况下未选择输入字段。为此,我一直发现这篇关于对话焦点的文章中的提示非常宝贵。
下面显示了标准输入对话框与使用大字体的确认对话框的对比。
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);
}
}
这对我更改 JOptionPane 中文本和按钮的字体很有用:
Font font = new Font(Font.SANS_SERIF, Font.PLAIN, 20);
UIManager.put("OptionPane.messageFont", 字体);
UIManager.put("OptionPane.buttonFont", 字体);
相信你想要TextField.font
。JTextField
这将为当前安装的外观返回所有 s 默认使用的字体...
更好的解决方案可能是提供您自己的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;
}
}
});
}
}
这是我们将使用的方式:
UIManager.put("OptionPane.messageFont", new Font("Arial", Font.BOLD, 14));
UIManager.put("OptionPane.buttonFont", new Font("Arial", Font.PLAIN, 12));
请记住在出现任何 JOptionPane 对话框之前设置它。我只是把它放在main
方法的第一行。
要了解我为什么这样做,UIManager的 DOC总是很有用的。
默认值
UIManager 管理三组 UIDefaults。按顺序,它们是:
开发者默认。除了少数例外,Swing 不会更改开发人员的默认设置;这些旨在由开发人员修改和使用。
外观和感觉默认值。外观默认值由安装时的外观作为当前外观提供(调用 setLookAndFeel())。可以使用 getLookAndFeelDefaults() 方法获得外观默认值。
系统默认值。系统默认值由 Swing 提供。调用任何各种 get 方法都会导致检查每个默认值,按顺序返回第一个非空值。例如,调用 UIManager.getString("Table.foreground") 会导致首先检查开发人员默认设置。如果开发人员默认值包含“Table.foreground”的值,则返回它,否则检查外观默认值,然后检查系统默认值。请务必注意,getDefaults 返回 UIDefaults 的自定义实例,其中内置了此解析逻辑。例如,UIManager.getDefaults().getString("Table.foreground") 等价于 UIManager.getString("Table.foreground")。两者都使用刚刚描述的算法解决。
因此,我们应该首先更改开发人员的默认设置。方法UIManager.put(Object key, Object value)
就是使用的方法。
公共静态对象放置(对象键,对象值)
在开发人员默认值中存储一个对象。这是 getDefaults().put(key, value) 的一个覆盖方法。这只会影响开发人员的默认设置,而不是系统或外观默认设置。
参数:
key - 一个指定检索键的对象
value - 要存储的对象;有关如何处理 null 的详细信息,请参阅 UIDefaults
返回: UIDefaults.put(java.lang.Object, java.lang.Object) 返回的对象
抛出:
NullPointerException - 如果键为空
这正是我正在寻找的:没有额外的面板,没有覆盖JOptionPane
.
属性名称的完整列表在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
这是我在 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);
}