Impostazione del carattere predefinito del programma Swing

Mi stavo chiedendo come impostare il carattere predefinito per il mio intero programma swing Java. Dalla mia ricerca sembra che possa essere fatto con UIManager , qualcosa che ha a che fare con LookAndFeel , ma non riesco a trovare specificamente come farlo, e UIManager sembra piuttosto complicato.

provare:

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

Chiama da …

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

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

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

Questo non solo imposterà Tahoma sulla tua interfaccia utente completa, ma attiverà anche l’anti-aliasing che rende ogni font molto più bello immediatamente.

Penso che sia meglio, chiamandolo per il laf attuale invece dell’intero UIManager

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

Da qualche parte nel main prima di istanziare il tuo object JFrame. Ha funzionato perfettamente per me. Ricorda che questo è il carattere predefinito, per i componenti che non hanno un carattere specificato.

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

Tieni presente che il modo di impostare il carattere predefinito dipende dal look and feel che stai utilizzando. La soluzione descritta da Romain Hippeau funziona bene con molti LAF ma non con Nimbus. Quello pubblicato da sherif funziona bene con Nimbus, ma non con altri (Metal, ad esempio).

La combinazione di entrambi potrebbe funzionare su gran parte della LAF, ma nessuna di queste soluzioni funziona con GTK + LAF.

Penso (ma non ne sono sicuro), non esiste una soluzione multipiattaforma.

Ispirato da Romain Hippeau, usa questo codice se vuoi impostare solo la dimensione del carattere.

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

Sto usando Nimbus L & F.

Usando il codice di @Romain Hippeau, ho dovuto usare UIManager.getLookAndFeelDefaults() invece di UIManager.getDefaults() e usare il riferimento restituito per put valori modificati:

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

Per qualche ragione, non sembra funzionare con il default L & F … (basato sui test limitati che ho eseguito)

Per risolvere questo problema, implemento semplicemente AWTEventListener e ascolto COMPONENT_ADDED di ContainerEvent.

Tutta la descrizione della storia su: http://wiki.idempiere.org/en/Swing_Miss_Support_Some_Language

Tutto il codice all’indirizzo: https://bitbucket.org/hieplq/unicentapos/src/9b22875ab65e26ff46fd9ae62d556b7f64621afa/src-extend/vn/hsv/uitil/font/FontGlyphsUtil.java?at=tip

  1. Implementa 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. Aggiungi listener del registro (il posto migliore per eseguirlo è quando si avvia il programma)
 Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.COMPONENT_EVENT_MASK | AWTEvent.CONTAINER_EVENT_MASK); 

nessuna di queste soluzioni funziona bene per me, io costruisco il mio (stupido) ma funziona:

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

La risposta corretta è quella di Amir Raminfar ma devi incapsulare il font a FontUIResource. Per esempio :

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

Ho usato l’ aspetto sintetico e ho sentito il file XML e ho definito i caratteri lì. Facile, flessibile e continente.
Devi creare una class con un createFont come:

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

E nel tuo synth xml definisci il font come:

   path_to_your_font font_size  

allora puoi usarlo come riferimento ovunque tu voglia nel xml.

A completamento della risposta di @Amir, questa è la lista completa delle chiavi

Io uso questa funzione

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

e lo chiamo in main prima di invocare l’interfaccia utente

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

Per un elenco completo delle chiavi di Swing UI Manager, controlla questo link