스윙 프로그램의 기본 글꼴 설정
전체 Java 스윙 프로그램의 기본 글꼴을 설정하는 방법이 궁금합니다. 내 연구에 따르면 UIManager
,,으로 할 수있는 것으로 LookAndFeel
보이지만 구체적으로 수행하는 방법을 찾을 수 없으며 UIManager
매우 복잡해 보입니다.
시험:
public static void setUIFont (javax.swing.plaf.FontUIResource f){
java.util.Enumeration keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get (key);
if (value instanceof javax.swing.plaf.FontUIResource)
UIManager.put (key, f);
}
}
전화 ...
setUIFont (new javax.swing.plaf.FontUIResource("Serif",Font.ITALIC,12));
UIManager.put("Button.font", /* font of your liking */);
UIManager.put("ToggleButton.font", /* font of your liking */);
UIManager.put("RadioButton.font", /* font of your liking */);
UIManager.put("CheckBox.font", /* font of your liking */);
UIManager.put("ColorChooser.font", /* font of your liking */);
UIManager.put("ComboBox.font", /* font of your liking */);
UIManager.put("Label.font", /* font of your liking */);
UIManager.put("List.font", /* font of your liking */);
UIManager.put("MenuBar.font", /* font of your liking */);
UIManager.put("MenuItem.font", /* font of your liking */);
UIManager.put("RadioButtonMenuItem.font", /* font of your liking */);
UIManager.put("CheckBoxMenuItem.font", /* font of your liking */);
UIManager.put("Menu.font", /* font of your liking */);
UIManager.put("PopupMenu.font", /* font of your liking */);
UIManager.put("OptionPane.font", /* font of your liking */);
UIManager.put("Panel.font", /* font of your liking */);
UIManager.put("ProgressBar.font", /* font of your liking */);
UIManager.put("ScrollPane.font", /* font of your liking */);
UIManager.put("Viewport.font", /* font of your liking */);
UIManager.put("TabbedPane.font", /* font of your liking */);
UIManager.put("Table.font", /* font of your liking */);
UIManager.put("TableHeader.font", /* font of your liking */);
UIManager.put("TextField.font", /* font of your liking */);
UIManager.put("PasswordField.font", /* font of your liking */);
UIManager.put("TextArea.font", /* font of your liking */);
UIManager.put("TextPane.font", /* font of your liking */);
UIManager.put("EditorPane.font", /* font of your liking */);
UIManager.put("TitledBorder.font", /* font of your liking */);
UIManager.put("ToolBar.font", /* font of your liking */);
UIManager.put("ToolTip.font", /* font of your liking */);
UIManager.put("Tree.font", /* font of your liking */);
출처 : http://www.jguru.com/faq/view.jsp?EID=340519
java -Dswing.aatext=true -Dswing.plaf.metal.controlFont=Tahoma -Dswing.plaf.metal.userFont=Tahoma …
이렇게하면 전체 UI에 Tahoma가 설정 될뿐만 아니라 모든 글꼴을 즉시 훨씬 더 아름답게 만드는 앤티 앨리어싱이 설정됩니다.
나는 이것이 더 낫다고 생각하며 전체 UIManager 대신 현재 laf를 호출하여 이것을 넣습니다.
UIManager.getLookAndFeelDefaults()
.put("defaultFont", new Font("Arial", Font.BOLD, 14));
JFrame 객체를 인스턴스화하기 전에 메인 어딘가에. 그것은 나를 위해 완벽하게 작동했습니다. 지정된 글꼴이없는 구성 요소의 경우 이것이 기본 글꼴임을 기억하십시오.
출처 : http://www.java.net/node/680725
기본 글꼴을 설정하는 방법은 사용중인 모양과 느낌에 따라 다릅니다. Romain Hippeau가 설명하는 솔루션은 많은 LAF에서는 잘 작동하지만 Nimbus에서는 잘 작동하지 않습니다. sherif가 게시 한 것은 Nimbus에서는 잘 작동하지만 다른 사람에서는 작동하지 않습니다 (예 : Metal).
둘 다 결합하면 대부분의 LAF에서 작동 할 수 있지만 이러한 솔루션 중 어느 것도 GTK + LAF에서 작동하지 않습니다.
저는 (확실하지 않습니다) 크로스 플랫폼 솔루션이 없다고 생각합니다.
Romain Hippeau에서 영감을 받아 글꼴 크기 만 설정하려면이 코드를 사용하세요.
for (Map.Entry<Object, Object> entry : javax.swing.UIManager.getDefaults().entrySet()) {
Object key = entry.getKey();
Object value = javax.swing.UIManager.get(key);
if (value != null && value instanceof javax.swing.plaf.FontUIResource) {
javax.swing.plaf.FontUIResource fr=(javax.swing.plaf.FontUIResource)value;
javax.swing.plaf.FontUIResource f = new javax.swing.plaf.FontUIResource(fr.getFamily(), fr.getStyle(), FONT_SIZE);
javax.swing.UIManager.put(key, f);
}
}
Nimbus L & F를 사용하고 있습니다.
@Romain Hippeau의 코드를 사용하여 반환 된 참조를 수정 된 값 UIManager.getLookAndFeelDefaults()
대신 UIManager.getDefaults()
사용하고 사용해야했습니다 put
.
int szIncr = 5; // Value to increase the size by
UIDefaults uidef = UIManager.getLookAndFeelDefaults();
for (Entry<Object,Object> e : uidef.entrySet()) {
Object val = e.getValue();
if (val != null && val instanceof FontUIResource) {
FontUIResource fui = (FontUIResource)val;
uidef.put(e.getKey(), new FontUIResource(fui.getName(), fui.getStyle(), fui.getSize()+szIncr));
}
}
어떤 이유로 기본 L & F에서 작동하지 않는 것 같습니다 ... (내가 수행 한 제한된 테스트를 기반으로 함)
이 문제를 해결하기 위해 AWTEventListener를 구현하고 ContainerEvent의 COMPONENT_ADDED를 수신합니다.
모든 이야기 설명 : http://wiki.idempiere.org/en/Swing_Miss_Support_Some_Language
- AWTEventListener 구현
public void eventDispatched(AWTEvent event) {
if (!isMissSupportGlyph || !(event instanceof ComponentEvent) || !(event instanceof ContainerEvent))
return;
if (event instanceof ContainerEvent){
ContainerEvent containerEvent = (ContainerEvent)event;
if (containerEvent.getID() == ContainerEvent.COMPONENT_ADDED){
updateChildControlFont(containerEvent.getChild());
}
}
}
- 레지스트리 리스너 추가 (이를 실행하는 가장 좋은 위치는 프로그램을 시작할 때입니다)
Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.COMPONENT_EVENT_MASK | AWTEvent.CONTAINER_EVENT_MASK);
정답은 Amir Raminfar의 답변이지만 글꼴을 FontUIResource로 캡슐화해야합니다. 예 :
UIManager.put("Button.font", new FontUIResource(new Font ("Helvetica", Font.BOLD, 16)));
I used the Synth look and feel XML file and defined the fonts there. Easy, flexible and continent.
You need to create a class with a createFont
like:
public class CustomFontResource {
public static FontUIResource createFont(String path, final int size) throws IOException, FontFormatException {
Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(path));
return new FontUIResource(font.deriveFont(Font.PLAIN, size));
}
And in your synth xml define the font like:
<object id="Basic_Regular" class="<your CustomFontResource class>"
method="createFont">
<string>path_to_your_font</string>
<int>font_size</int>
</object>
then you may use it as a reference wherever you want in the xml.
As a completion of @Amir answer, this is the complete list of keys
I use this function
private void setFont(FontUIResource myFont) {
UIManager.put("CheckBoxMenuItem.acceleratorFont", myFont);
UIManager.put("Button.font", myFont);
UIManager.put("ToggleButton.font", myFont);
UIManager.put("RadioButton.font", myFont);
UIManager.put("CheckBox.font", myFont);
UIManager.put("ColorChooser.font", myFont);
UIManager.put("ComboBox.font", myFont);
UIManager.put("Label.font", myFont);
UIManager.put("List.font", myFont);
UIManager.put("MenuBar.font", myFont);
UIManager.put("Menu.acceleratorFont", myFont);
UIManager.put("RadioButtonMenuItem.acceleratorFont", myFont);
UIManager.put("MenuItem.acceleratorFont", myFont);
UIManager.put("MenuItem.font", myFont);
UIManager.put("RadioButtonMenuItem.font", myFont);
UIManager.put("CheckBoxMenuItem.font", myFont);
UIManager.put("OptionPane.buttonFont", myFont);
UIManager.put("OptionPane.messageFont", myFont);
UIManager.put("Menu.font", myFont);
UIManager.put("PopupMenu.font", myFont);
UIManager.put("OptionPane.font", myFont);
UIManager.put("Panel.font", myFont);
UIManager.put("ProgressBar.font", myFont);
UIManager.put("ScrollPane.font", myFont);
UIManager.put("Viewport.font", myFont);
UIManager.put("TabbedPane.font", myFont);
UIManager.put("Slider.font", myFont);
UIManager.put("Table.font", myFont);
UIManager.put("TableHeader.font", myFont);
UIManager.put("TextField.font", myFont);
UIManager.put("Spinner.font", myFont);
UIManager.put("PasswordField.font", myFont);
UIManager.put("TextArea.font", myFont);
UIManager.put("TextPane.font", myFont);
UIManager.put("EditorPane.font", myFont);
UIManager.put("TabbedPane.smallFont", myFont);
UIManager.put("TitledBorder.font", myFont);
UIManager.put("ToolBar.font", myFont);
UIManager.put("ToolTip.font", myFont);
UIManager.put("Tree.font", myFont);
UIManager.put("FormattedTextField.font", myFont);
UIManager.put("IconButton.font", myFont);
UIManager.put("InternalFrame.optionDialogTitleFont", myFont);
UIManager.put("InternalFrame.paletteTitleFont", myFont);
UIManager.put("InternalFrame.titleFont", myFont);
}
and i call it in main
before invoking the ui
setFont(new FontUIResource(new Font("Cabin", Font.PLAIN, 14)));
For a complete list of Swing UI Manager keys check this link
none of theses solutions work fine for me, I build my own (stupid) one but it works:
private void changeFontRecursive(Container root, Font font) {
for (Component c : root.getComponents()) {
c.setFont(font);
if (c instanceof Container) {
changeFontRecursive((Container) c, font);
}
}
}
참고URL : https://stackoverflow.com/questions/7434845/setting-the-default-font-of-swing-program
'development' 카테고리의 다른 글
Android에서 데이터를 지속적으로 만들기 (0) | 2020.12.11 |
---|---|
백분율 기호 앞에 선행 공백없이 C # String.Format '{0 : p0}'사용 (0) | 2020.12.11 |
Composer : 최소 안정성 수준이 다른 필수 패키지 (0) | 2020.12.11 |
"find"명령 결과를 Bash에 배열로 저장하려면 어떻게해야합니까? (0) | 2020.12.11 |
word2vec bin 파일을 텍스트로 변환 (0) | 2020.12.11 |