2012-03-31 39 views
6

Hãy là có một cách khác làm thế nào để thay đổi phông chữ trong thời gian chạy như sử dụng FontUIResource, cho toàn bộ giao diện AWT/Swing, mà không cần bất kỳ kiến ​​thức/quan tâm về nếu có các biến địa phương và loại JComponentsThay đổi Font trong thời gian chạy

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: Tôi gửi câu chuyện với Nimbus, sau đó mã cho 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 cho [sscce] (http://sscce.org/); xem thêm ['FontShower'] (http://mindprod.com/applet/fontshower.html). – trashgod

+0

Ghi chú nhỏ: Chỉ cần một phiên bản 'javax.swing.Timer'; chỉ cần một 'setSelectedItem()'; xem xét 'getAvailableFontFamilyNames (Locale.getDefault())'. Hoạt động trên Mac OS. – trashgod

+0

@trashgod chắc chắn một lần nữa một phần của số dư vô dụng của tôi, trước đây tôi đã auto_select cho JComboBox từ Timer và sau đó thay đổi Font theo giá trị từ selectedItem của JComboBox, tôi xin lỗi vì điều đó – mKorbel

Trả lời

1

Ví dụ: Tạo một chữ mới từ danh sách fontFamily, và áp dụng nó vào thành phần của bạn với c.setFont (font);

Cách tiếp cận thứ hai là tìm kiếm TTF-Files (ví dụ) và tạo Phông chữ mới bằng phương thức tĩnh Font.createFont (tệp mới ("..."));

Ứng dụng đơn giản này sẽ tạo Danh sách phông chữ theo gia đình và áp dụng cho JButton và 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 bây giờ tôi thấy rằng câu hỏi của tôi không được hỏi chính xác, chắc chắn tôi nhớ ở đó cho toàn bộ giao diện AWT/Swing, mà không quan tâm về biến cục bộ, danke – mKorbel

+0

@mKorbel: Tôi xin lỗi, tôi không chắc liệu tôi có hiểu không. Bạn chỉ quan tâm đến việc chuyển đổi toàn bộ giao diện, phông chữ cho tất cả các thành phần - chứ không phải riêng lẻ? Và bạn đang tìm kiếm một cách tiếp cận thứ hai, chỉ từ lợi ích thuần túy - không phải với một vấn đề cụ thể mà bạn không thể giải quyết? Bạn đã tìm kiếm "LookAndFeel" chưa? Tôi đã đọc một vài điều về nó cách đây nhiều năm, nhưng không điều tra. Tôi nghĩ rằng đó là về việc chuyển đổi toàn bộ giao diện của một ứng dụng và cũng nên thay đổi phông chữ. –

+0

Một ý tưởng khác sẽ là một khách truy cập, duyệt qua toàn bộ GUI-Tree của bạn (không biết nó cứng như thế nào) và áp dụng một số phông chữ ở khắp mọi nơi. –

Các vấn đề liên quan