java - 更改 JOptionPane 和 JFrame 标题栏字体

标签 java swing fonts joptionpane substance

我必须将 JframeJOptionPane 元素的标题栏指定为柬埔寨语(unicode)文本数据。
默认字体(对话框)无法正确呈现文本,我想将默认字体覆盖为其他字体。
请帮忙,我该如何覆盖它?
我尝试了以下方法,但没有一个起作用。 (LaF:物质 7.2.1)

UIManager.put("OptionPane.font", new FontUIResource(Main.get_ui_font()));
UIManager.put("TitledBorder.font", Main.get_ui_font());
UIManager.put("Frame.font", Main.get_ui_font());

我在上面测试了 FontFontUIResource,没有区别!
下面的代码抛出了一个内部的substance api异常,它是关于nullpointerexception的,但是在完整的堆栈中,我看不到我的代码的任何堆栈跟踪,很奇怪,可能是一个错误。

SubstanceLookAndFeel.setFontPolicy(new FontPolicy() {public FontSet getFontSet(String arg0, UIDefaults arg1) {
                FontSet fs=new FontSet() {
                    public FontUIResource getWindowTitleFont() {return new FontUIResource(Main.get_ui_font());}
                    public FontUIResource getTitleFont() {return new FontUIResource(Main.get_ui_font());}
                    public FontUIResource getSmallFont() {return new FontUIResource(Main.get_ui_font().deriveFont(10.0F));}
                    public FontUIResource getMessageFont() {return new FontUIResource(Main.get_ui_font());}
                    public FontUIResource getMenuFont() {return new FontUIResource(Main.get_ui_font());}
                    public FontUIResource getControlFont() {return new FontUIResource(Main.get_ui_font());}
                };
                return fs;
            }
        });

上述代码的完整堆栈跟踪

Exception in thread "main" java.lang.NullPointerException
    at org.pushingpixels.substance.api.SubstanceLookAndFeel.setSkin(SubstanceLookAn
dFeel.java:2150)
    at org.pushingpixels.substance.api.SubstanceLookAndFeel.access$000(SubstanceLoo
kAndFeel.java:92)
    at org.pushingpixels.substance.api.SubstanceLookAndFeel$3.run(SubstanceLookAndF
eel.java:2136)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.ja
va:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java
:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:11
6)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java
:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

最佳答案

您可以发布 Main.get_ui_font() 方法的代码吗?

绘制 JFramesJDialogs 窗口边框的任务被委托(delegate)给外部窗口系统,因此我不确定您是否可以轻松更改它们。

此外:

  • Frame.font 不是有效 key 。
  • TitledBorder.fontJFrames中的标题无关,请查看文档。
  • OptionPane.font 更改 OptionPane 内消息的字体

无论如何,要使用 UIManager.put() 更改字体,您应该提供 key 和 FontUIResource 作为参数。 所以,我不确定你的 Main.get_ui_font() 返回什么,但考虑 FontUIResource 的构造函数 -- FontUIResource(Font font)FontUIResource(String name, int style, int size) -- if returns Font 比使用 1;否则,如果您的方法返回 FontUIResource,请使用 2。

  1. UIManager.put("key", new FontUIResource(Main.get_ui_font()));
  2. UIManager.put("key", Main.get_ui_font());

还请记住,如果您想使用“非标准”字体,您应该在使用它之前注册它。为此,请使用 GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(..)

关于java - 更改 JOptionPane 和 JFrame 标题栏字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24094284/

相关文章:

java - JFrame 内的 JPanel

html - @font-face 强标签和仿粗体渲染之间的问题

python - 使用 matplotlib 创建的 EPS 无法正确显示文本

java - 是 javax/mail/asynchronous 中 'send' 的方法 'Transport'

java - 更新方法未在 CRUD 应用程序中更新

java - 未经检查地调用 'continueWithTask....' 作为原始类型的成员

java - 查找树是否平衡的迭代解决方案

Java awt.canvas 在 JScrollPane 内部时不会被剪裁

Java:按住鼠标时基于二维数组填充图形

linux - 如何在 Red Hat Enterprise Linux Server 6.5 版中正确配置 vncserver