Я должен указать 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)
Не могли бы вы отправить код метода Main.get_ui_font()?
Задача рисования границ JFrames
и JDialogs
делегирована внешней системе окон, поэтому я не уверен, что вы можете легко их изменить.
Более того:
JFrames
, посмотрите на документацию.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.
Помните также, что если вы хотите использовать "нестандартный" шрифт, вы должны его зарегистрировать, прежде чем его использовать. Для этого используйте GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(..)
Font
иFontUIResource
, никаких отличий. Я просто попробовал много способов, и я бы сказал, что это так плохо, что мы не можем это изменить.Jframe.undecorated(true)
и создаю поддельный оконный декоратор, используя внутренние панели. Не совсем простое и чистое решение, но другого пути я не вижу.