2012-03-31 6 views
6

Пожалуйста, есть другой способ, как изменить шрифт во время выполнения, как с помощью FontUIResource, для всего GUI в AWT/Swing, без каких-либо знаний/интереса о если есть локальные переменные и тип JComponentsИзменение шрифта во время выполнения

enter image description hereenter image description here

import java.awt.*; 
import java.awt.event.*; 
import java.util.Locale; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.*; 
import javax.swing.plaf.FontUIResource; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 

public class SystemFontDisplayer extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JFrame frame = new JFrame("Nimbus UIDeafaults and Font"); 
    private JComboBox fontsBox; 
    private javax.swing.Timer timer = null; 
    private JButton testButton = new JButton("testButton"); 
    private JTextField testTextField = new JTextField("testTextField"); 
    private JLabel testLabel = new JLabel("testLabel"); 

    public SystemFontDisplayer() { 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     String[] fontFamilyNames = ge.getAvailableFontFamilyNames(Locale.getDefault()); 
     fontsBox = new JComboBox(fontFamilyNames); 
     fontsBox.setSelectedItem(0); 
     fontsBox.setRenderer(new ComboRenderer()); 
     fontsBox.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent e) { 
       if (e.getStateChange() == ItemEvent.SELECTED) { 
        final String fontName = fontsBox.getSelectedItem().toString(); 
        fontsBox.setFont(new Font(fontName, Font.PLAIN, 16)); 
        start(); 
       } 
      } 
     }); 
     fontsBox.setSelectedItem(0); 
     fontsBox.getEditor().selectAll(); 
     frame.setLayout(new GridLayout(4, 0, 20, 20)); 
     frame.add(fontsBox); 
     frame.add(testButton); 
     frame.add(testTextField); 
     frame.add(testLabel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(200, 105); 
     frame.pack(); 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       fontsBox.setPopupVisible(true); 
       fontsBox.setPopupVisible(false); 
      } 
     }); 
     frame.setVisible(true); 
    } 

    private void start() { 
     timer = new javax.swing.Timer(750, updateCol()); 
     timer.setRepeats(false); 
     timer.start(); 
    } 

    public Action updateCol() { 
     return new AbstractAction("text load action") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       final Font fnt = new Font(fontsBox.getSelectedItem().toString(), Font.PLAIN, 12); 
       /*try { 
        LookAndFeel lnf = UIManager.getLookAndFeel().getClass().newInstance(); 
        final FontUIResource res = new FontUIResource(fnt); 
        UIDefaults uiDefaults = lnf.getDefaults(); 
        uiDefaults.put("Button.font", res); 
        uiDefaults.put("TextField.font", res); 
        uiDefaults.put("Label.font", res); 
        UIManager.getLookAndFeel().uninitialize(); 
        UIManager.setLookAndFeel(lnf); 
       } catch (InstantiationException ex) { 
        Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (IllegalAccessException ex) { 
        Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (UnsupportedLookAndFeelException ex) { 
        Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); 
       } 
       UIDefaults defaults = UIManager.getDefaults(); 
       final FontUIResource res = new FontUIResource(fnt); 
       defaults.put("Button.font", res); 
       defaults.put("TextField.font", res); 
       defaults.put("Label.font", res); 
       SwingUtilities.updateComponentTreeUI(frame);*/ 
       final FontUIResource res = new FontUIResource(fnt); 
       UIManager.getLookAndFeelDefaults().put("Button.font", res); 
       UIManager.getLookAndFeelDefaults().put("TextField.font", res); 
       UIManager.getLookAndFeelDefaults().put("Label.font", res); 
       SwingUtilities.updateComponentTreeUI(frame); 
      } 
     }; 
    } 

    public static void main(String arg[]) { 
     /*try { 
      for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(laf.getName())) { 
        UIManager.setLookAndFeel(laf.getClassName()); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }*/ 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       SystemFontDisplayer systemFontDisplayer = new SystemFontDisplayer(); 
      } 
     }); 
    } 

    private class ComboRenderer extends BasicComboBoxRenderer { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      final Object fntObj = value; 
      final String fontFamilyName = (String) fntObj; 
      setFont(new Font(fontFamilyName, Font.PLAIN, 16)); 
      return this; 
     } 
    } 
} 

.

EDIT: Я отправил рассказ с Nimbus, затем код для Nimbus

import java.awt.*; 
import java.awt.event.*; 
import java.util.Locale; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.*; 
import javax.swing.plaf.FontUIResource; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 

public class SystemFontDisplayer extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JFrame frame = new JFrame("Nimbus UIDeafaults and Font"); 
    private JComboBox fontsBox; 
    private javax.swing.Timer timer = null; 
    private JButton testButton = new JButton("testButton"); 
    private JTextField testTextField = new JTextField("testTextField"); 
    private JLabel testLabel = new JLabel("testLabel"); 

    public SystemFontDisplayer() { 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     String[] fontFamilyNames = ge.getAvailableFontFamilyNames(Locale.getDefault()); 
     fontsBox = new JComboBox(fontFamilyNames); 
     fontsBox.setSelectedItem(0); 
     fontsBox.setRenderer(new ComboRenderer()); 
     fontsBox.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent e) { 
       if (e.getStateChange() == ItemEvent.SELECTED) { 
        final String fontName = fontsBox.getSelectedItem().toString(); 
        fontsBox.setFont(new Font(fontName, Font.PLAIN, 16)); 
        start(); 
       } 
      } 
     }); 
     fontsBox.setSelectedItem(0); 
     fontsBox.getEditor().selectAll(); 
     frame.setLayout(new GridLayout(4, 0, 20, 20)); 
     frame.add(fontsBox); 
     frame.add(testButton); 
     frame.add(testTextField); 
     frame.add(testLabel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(200, 105); 
     frame.pack(); 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       fontsBox.setPopupVisible(true); 
       fontsBox.setPopupVisible(false); 
      } 
     }); 
     frame.setVisible(true); 
    } 

    private void start() { 
     timer = new javax.swing.Timer(750, updateCol()); 
     timer.setRepeats(false); 
     timer.start(); 
    } 

    public Action updateCol() { 
     return new AbstractAction("text load action") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       final Font fnt = new Font(fontsBox.getSelectedItem().toString(), Font.PLAIN, 12); 
       try { 
        LookAndFeel lnf = UIManager.getLookAndFeel().getClass().newInstance(); 
        final FontUIResource res = new FontUIResource(fnt); 
        UIDefaults uiDefaults = lnf.getDefaults(); 
        uiDefaults.put("Button.font", res); 
        uiDefaults.put("TextField.font", res); 
        uiDefaults.put("Label.font", res); 
        UIManager.getLookAndFeel().uninitialize(); 
        UIManager.setLookAndFeel(lnf); 
       } catch (InstantiationException ex) { 
        Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (IllegalAccessException ex) { 
        Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (UnsupportedLookAndFeelException ex) { 
        Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); 
       } 
       UIDefaults defaults = UIManager.getDefaults(); 
       final FontUIResource res = new FontUIResource(fnt); 
       defaults.put("Button.font", res); 
       defaults.put("TextField.font", res); 
       defaults.put("Label.font", res); 
       SwingUtilities.updateComponentTreeUI(frame); 
       /*final FontUIResource res = new FontUIResource(fnt); 
       UIManager.getLookAndFeelDefaults().put("Button.font", res); 
       UIManager.getLookAndFeelDefaults().put("TextField.font", res); 
       UIManager.getLookAndFeelDefaults().put("Label.font", res); 
       SwingUtilities.updateComponentTreeUI(frame);*/ 
      } 
     }; 
    } 

    public static void main(String arg[]) { 
     try { 
      for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(laf.getName())) { 
        UIManager.setLookAndFeel(laf.getClassName()); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       SystemFontDisplayer systemFontDisplayer = new SystemFontDisplayer(); 
      } 
     }); 
    } 

    private class ComboRenderer extends BasicComboBoxRenderer { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      final Object fntObj = value; 
      final String fontFamilyName = (String) fntObj; 
      setFont(new Font(fontFamilyName, Font.PLAIN, 16)); 
      return this; 
     } 
    } 
} 
+0

+1 для [sscce] (http://sscce.org/); см. также ['FontShower'] (http://mindprod.com/applet/fontshower.html). – trashgod

+0

Незначительные примечания: нужен только один экземпляр 'javax.swing.Timer'; нужен только один 'setSelectedItem()'; рассмотрите 'getAvailableFontFamilyNames (Locale.getDefault())'. Работает на Mac OS. – trashgod

+0

@trashgod уверенно снова часть моих бесполезных баластов, ранее у меня есть auto_select для JComboBox от Timer, а затем сменил Font по значению из выбранного JComboBoxItem, я сожалею об этом – mKorbel

ответ

1

Например: Создать новый шрифт из списка FontFamily, и применить его к компоненте с c.setFont (шрифт);

Второй подход - поиск TTF-файлов (например) и создание новых шрифтов со статическим методом Font.createFont (новый файл («...»));

Это простое приложение создаст список шрифтов по семействам и применит его к JButton и JTextField.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
/** 
    FontSwitcher 

    @author Stefan Wagner 
    @date So 13. Mai 03:25:23 CEST 2012  
*/ 
public class FontSwitcher extends JFrame implements ActionListener 
{ 
    private static final String progname = "FontSwitcher 0.1"; 

    private JTextField feedback; 
    private JButton jb; 
    private JList fontList; 

    public FontSwitcher() 
    { 
     super (progname); 
     JPanel mainpanel = new JPanel(); 
     mainpanel.setLayout (new BorderLayout()); 
     this.getContentPane().add (mainpanel); 

     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     String [] fonts = ge.getAvailableFontFamilyNames(); 
     fontList = new JList (fonts); 
     JScrollPane js = new JScrollPane (fontList); 

     feedback = new JTextField ("Feedback"); 
     jb = new JButton ("apply font"); 
     jb.addActionListener (this); 
     mainpanel.add (feedback, BorderLayout.NORTH); 
     mainpanel.add (js, BorderLayout.CENTER); 
     mainpanel.add (jb, BorderLayout.SOUTH); 

     setSize (400, 800); 
     setLocation (100, 100); 
     setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     setVisible (true); 
    } 

    public void actionPerformed (final ActionEvent e) 
    { 
     SwingWorker worker = new SwingWorker() 
     { 
      protected String doInBackground() throws InterruptedException 
      { 
       String cmd = e.getActionCommand(); 
       if (cmd.equals ("apply font")) 
       { 
        String selectedFont = fontList.getSelectedValue().toString(); 
        Font font = new Font (selectedFont, Font.TRUETYPE_FONT, 14); 
        jb.setFont (font); 
        feedback.setFont (font); 
       } 
       return "done"; 
      } 
      protected void done() 
      { 
       feedback.setText ("done"); 
      } 
     }; 
     worker.execute(); 
    } 

    public static void main (final String args[]) 
    { 
     Runnable runner = new Runnable() 
     { 
      public void run() 
      { 
       new FontSwitcher(); 
      } 
     }; 
     EventQueue.invokeLater (runner); 
    } 
} 
+0

aaach теперь я вижу, что мой вопрос задан неправильно, конечно, я пропустил там весь графический интерфейс AWT/Swing, без интереса о локальной переменной, danke – mKorbel

+0

@mKorbel: Извините, я не уверен, понимаю ли я. Вы интересуетесь только переключением всего вида, шрифтов для всех компонентов - не индивидуально? И вы ищете второй подход, только из чистого интереса - не с конкретной проблемой, которую вы не можете решить? Вы искали «LookAndFeel»? Я кое-что прочитал об этом много лет назад, но не исследовал его. Я думаю, что речь идет о переключении всего внешнего вида приложения и необходимости менять шрифты. –

+0

Еще одна идея - это посетитель, который пересекает все ваше GUI-Tree (не знаю, как это сложно) и везде применяется какой-либо шрифт. –

Смежные вопросы