Configuración de la fuente predeterminada del progtwig Swing

Me preguntaba cómo configurar la fuente predeterminada para todo mi progtwig Java swing. De mi investigación parece que se puede hacer con UIManager , algo que ver con LookAndFeel , pero no puedo encontrar específicamente cómo hacerlo, y el UIManager parece bastante complicado.

tratar:

 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); } } 

Llamar por …

 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 */); 

Fuente: http://www.jguru.com/faq/view.jsp?EID=340519

 java -Dswing.aatext=true -Dswing.plaf.metal.controlFont=Tahoma -Dswing.plaf.metal.userFont=Tahoma … 

Esto no solo configurará a Tahoma en su UI completa sino que también activará el anti-aliasing, lo que hace que cualquier fuente sea mucho más hermosa inmediatamente.

Creo que esto es mejor, llamándolo por el laf actual en lugar de que todo el UIManager ponga esto

 UIManager.getLookAndFeelDefaults() .put("defaultFont", new Font("Arial", Font.BOLD, 14)); 

En algún lugar en el principal antes de instanciar su objeto JFrame. Funcionó perfectamente para mí. Recuerde que esta es la fuente predeterminada para los componentes que no tienen una fuente especificada.

fuente: http://www.java.net/node/680725

Tenga en cuenta que la forma de establecer la fuente predeterminada depende del Look And Feel que esté usando. La solución descrita por Romain Hippeau funciona bien con muchas LAF pero no con Nimbus. El publicado por sherif funciona bien con Nimbus, pero no con otros (Metal, por ejemplo).

La combinación de ambos podría funcionar en la mayoría de las LAF, pero ninguna de estas soluciones funciona con GTK + LAF.

Creo (pero no estoy seguro), no hay una solución multiplataforma.

Inspirado por Romain Hippeau, use este código si desea establecer solo el tamaño de la fuente.

 for (Map.Entry 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); } } 

Estoy usando Nimbus L & F.

Utilizando el código de @Romain Hippeau, tuve que usar UIManager.getLookAndFeelDefaults() lugar de UIManager.getDefaults() y usar la referencia devuelta para put valores modificados:

  int szIncr = 5; // Value to increase the size by UIDefaults uidef = UIManager.getLookAndFeelDefaults(); for (Entry 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)); } } 

Por alguna razón, no parece funcionar con el L & F predeterminado … (basado en las pruebas limitadas que realicé)

Para resolver este problema, simplemente implemento AWTEventListener y escucho COMPONENT_ADDED de ContainerEvent.

Toda la descripción de la historia en: http://wiki.idempiere.org/en/Swing_Miss_Support_Some_Language

Todo el código en: https://bitbucket.org/hieplq/unicentapos/src/9b22875ab65e26ff46fd9ae62d556b7f64621afa/src-extend/vn/hsv/uitil/font/FontGlyphsUtil.java?at=tip

  1. Implementar 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()); } } } 
  1. Agregar detector de registro (el mejor lugar para ejecutar esto es al iniciar el progtwig)
 Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.COMPONENT_EVENT_MASK | AWTEvent.CONTAINER_EVENT_MASK); 

ninguna de estas soluciones funciona bien para mí, construyo mi propia (estúpida) pero funciona:

 private void changeFontRecursive(Container root, Font font) { for (Component c : root.getComponents()) { c.setFont(font); if (c instanceof Container) { changeFontRecursive((Container) c, font); } } } 

La respuesta correcta es la de Amir Raminfar pero tienes que encapsular la fuente FontUIResource. Por ejemplo :

 UIManager.put("Button.font", new FontUIResource(new Font ("Helvetica", Font.BOLD, 16))); 

Usé el archivo XML Look and feel de Synth y definí las fonts allí. Fácil, flexible y continente.
Necesitas crear una clase con un createFont como:

 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)); } 

Y en su sintetizador xml defina la fuente como:

   path_to_your_font font_size  

entonces puedes usarlo como referencia donde quieras en el xml.

Como finalización de @Amir answer, esta es la lista completa de claves

Yo uso esta función

 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); } 

y lo llamo en main antes de invocar el ui

 setFont(new FontUIResource(new Font("Cabin", Font.PLAIN, 14))); 

Para obtener una lista completa de las teclas de Swing UI Manager, consulte este enlace