java - texto - Configuración de la fuente predeterminada del programa Swing
instalar fuentes en java (12)
Me preguntaba cómo configurar la fuente predeterminada para todo mi programa 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.
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 link
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
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<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));
}
}
Por alguna razón, no parece funcionar con el L & F predeterminado ... (basado en las pruebas limitadas que realicé)
Inspirado por Romain Hippeau, use este código si desea establecer solo el tamaño de la fuente.
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);
}
}
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)));
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
- 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());
}
}
}
- Agregar detector de registro (el mejor lugar para ejecutar esto es al iniciar el programa)
Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.COMPONENT_EVENT_MASK | AWTEvent.CONTAINER_EVENT_MASK);
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.
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);
}
}
}
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));
Usé el archivo XML Look and feel de Synth y definí las fuentes 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:
<object id="Basic_Regular" class="<your CustomFontResource class>"
method="createFont">
<string>path_to_your_font</string>
<int>font_size</int>
</object>
entonces puedes usarlo como referencia donde quieras en el xml.
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 */);
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.