Изменить шрифт JOptionPane и JFrame

1

Я должен указать Jframe и JOptionPane для текстовых данных в камбоджийском (юникод).
По умолчанию шрифт (диалог) не отображает текст правильно, и я хочу переопределить шрифт по умолчанию для чего-то другого.
Пожалуйста, дайте руку, как я могу ее переопределить?
Я попробовал следующее, никто из них не работал. (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());

Я тестировал выше как с Font и с FontUIResource, без разницы!
Следующий код генерирует исключение внутреннего вещества 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)
Теги:
fonts
swing
joptionpane
substance

1 ответ

1

Не могли бы вы отправить код метода Main.get_ui_font()?

Задача рисования границ JFrames и JDialogs делегирована внешней системе окон, поэтому я не уверен, что вы можете легко их изменить.

Более того:

  • Frame.font не является допустимым ключом.
  • TitledBorder.font не имеет ничего общего с названиями в JFrames, посмотрите на документацию.
  • OptionPane.font изменяет шрифт сообщения внутри OptionPane

Во всяком случае, для изменения шрифта с UIManager.put() вы должны UIManager.put() качестве параметров ключ и FontUIResource. Итак, я не уверен, что возвращает ваш Main.get_ui_font(), но учитывает конструкторы FontUIResource - FontUIResource(Font font) и FontUIResource(String name, int style, int size) - если возвращает Font чем использовать 1; в противном случае, если ваш метод возвращает FontUIResource, используйте 2.

  1. UIManager.put("ключ", новый FontUIResource (Main.get_ui_font()));
  2. UIManager.put("ключ", Main.get_ui_font());

Помните также, что если вы хотите использовать "нестандартный" шрифт, вы должны его зарегистрировать, прежде чем его использовать. Для этого используйте GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(..)

  • 0
    Брат, я регистрирую любой шрифт, с которым хочу работать, я также тестировал и Font и FontUIResource , никаких отличий. Я просто попробовал много способов, и я бы сказал, что это так плохо, что мы не можем это изменить.
  • 0
    По крайней мере, вы видите какие-либо изменения в сообщении OptionPane при изменении значения OptionPane.font ? Если да, значит, по крайней мере, вы меняете шрифт более корректно. Для изменения заголовка окна у вас нет ключей, и я не вижу другого обходного пути, если не использую Jframe.undecorated(true) и создаю поддельный оконный декоратор, используя внутренние панели. Не совсем простое и чистое решение, но другого пути я не вижу.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню