2012-03-31 65 views
6

请有另一种方式如何在运行时更改字体的使用FontUIResource,整个AWT/Swing GUI的,没有关于是否有局部变量和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; 
     } 
    } 
} 

编辑:我张贴的叙述与灵气,那么代码雨云

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 2012-03-31 18:10:32

+0

小注:只需要一个'javax.swing.Timer'实例;只需要一个'setSelectedItem()';考虑'getAvailableFontFamilyNames(Locale.getDefault())'。适用于Mac OS。 – trashgod 2012-03-31 18:39:48

+0

@trashgod再次肯定我的无用balasts的一部分,以前我有从Timer的JComboBox的auto_select,然后从JComboBox的selectedItem值更改字体,我很抱歉 – mKorbel 2012-03-31 19:34:36

回答

1

例如:从的FontFamily列表中创建一个新的字体,并将其与c.setFont(字体)应用到你的组件;第二种方法是搜索TTF文件(例如),并用静态方法Font.createFont(new File(“...”))创建新的字体。

这个简单的应用程序将按家族创建一个字体列表,并将其应用于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

现在我看到我的问题没有被正确地询问,当然我错过了整个AWT/Swing GUI,没有任何兴趣关于本地变量,danke – mKorbel 2012-05-14 21:26:38

+0

@mKorbel:对不起,我不确定我是否理解。你只想切换整个外观,所有组件的字体 - 不是单独的?而你正在寻找第二种方法,只能从纯粹的兴趣中寻找 - 而不是解决你无法解决的具体问题?你是否搜索过“LookAndFeel”?几年前我读过一些关于它的内容,但没有对它进行调查。我认为这是关于切换应用程序的整体外观和感觉,并且应该更改字体。 – 2012-05-14 22:06:57

+0

另一个想法是访问者,它遍历整个GUI-Tree(不知道它有多难),并且在任何地方应用某种字体。 – 2012-05-14 22:09:45