千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          字體選擇器其實也是挺常用的,可是JAVA就是沒有提供,可能是SUN覺得字體選擇器無關緊要吧,所以SUN只提供了文件選擇器和顏色選擇器這兩個比較難實現的,那么容易實現的也就留給我們自己實現了.我實現的這個文件選擇器是以前實現的.類的全稱叫lbf.swing.JFontChooser,可以調用的方法是JFontChooser.showDialog(Frame owner,String title)此方法第一個參數傳入父組件(可以為null),第二個參數傳入對話框的標題,該方法返回Font對象,如果用戶直接關閉或者點擊取消,則返回null,點擊確定,則返回選中的字體對象.
          /*
           * JFontChooser.java
           *
           * Created on 2006年11月17日, 上午11:21
           *
           * To change this template, choose Tools | Template Manager
           * and open the template in the editor.
           
          */

          package lbf.swing;

          /**
           *
           * 
          @author lbf
           
          */
          import javax.swing.*;
          import java.awt.event.*;
          import java.awt.*;
          import java.util.*;
          import javax.swing.event.*;
          public class JFontChooser extends JPanel implements ActionListener,ListSelectionListener{
              
          private JDialog jd;//用于顯示模態的窗體
              private JComboBox fonts;//用于選擇字體的下拉框
              private JList face,size;//用于選擇字形和字號的列表
              private JTextField sizeJT;//用于顯示選中的字形和字號
              private JButton ok,cancel;//表示選中和取消的按鈕
              private Font current;//表示當然選中的字體
              private GraphicsEnvironment ge;//表示當前的圖形環境
              private JLabel demo;//表示預覽的label
              private String fontName="宋體";
              
          private int fontStyle=Font.PLAIN,fontSize=20;
              
          private Frame owner;//表示父類的組件窗體
              private Hashtable<String,Integer> ht;//名字到大小的映射
              /** Creates a new instance of JFontChooser */
              
          private JFontChooser() {
                  initOther();
              }
              
          private void initOther(){
                  current
          =new Font(fontName,fontStyle,fontSize);
                  ht
          =new Hashtable<String,Integer>();
                  sizeJT
          =new JTextField("20");
                  sizeJT.setEditable(
          false);
                  sizeJT.setBounds(
          260,40,50,20);
                  ge
          =GraphicsEnvironment.getLocalGraphicsEnvironment();
                  String[] family
          =ge.getAvailableFontFamilyNames();
                  fonts
          =new JComboBox(family);
                  fonts.setEditable(
          false);
                  fonts.setMaximumRowCount(
          5);
                  demo
          =new JLabel("千里冰封  ABCD abcd",JLabel.CENTER);
                  demo.setFont(current);
                  String[] faceString
          ={"正常","粗體","斜體","粗體+斜體"};
                  String[] sizeString
          ={"初號","小初","一號","小一","二號","小二",
                  
          "三號","小三","四號","小四","五號","小五","六號","小六","七號",
                  
          "八號","5","8","9","10","11","12","14","16","18","20","22","24",
                  
          "26","28","36","48","72"};
                  
          int[] sizeValue={42,36,26,24,22,18,16,15,14,12,11,9,7,6,5,4,5,8,9,10,11,12,14,16,18,20,
                  
          22,24,26,28,36,48,72};
                  
          for(int i=0;i<sizeString.length;i++){
                      ht.put(sizeString[i],sizeValue[i]);
                  }
                  face
          =new JList(faceString);
                  size
          =new JList(sizeString);
                  face.setSelectedIndex(
          0);
                  size.setSelectedIndex(
          25);
                  fonts.setSelectedItem(
          "宋體");
                  face.setVisibleRowCount(
          4);
                  size.setVisibleRowCount(
          4);
                  ok
          =new JButton("確定");
                  cancel
          =new JButton("取消");
                  ok.addActionListener(
          this);
                  cancel.addActionListener(
          this);
                  fonts.addActionListener(
          this);
                  face.addListSelectionListener(
          this);
                  size.addListSelectionListener(
          this);
              }
              
          private void initWindow(String title){
                  
          this.setLayout(new BorderLayout());
                  JLabel fontLabel
          =new JLabel("字體");
                  JLabel faceLabel
          =new JLabel("字形");
                  JLabel sizeLabel
          =new JLabel("字號");
                  fontLabel.setForeground(Color.RED);
                  faceLabel.setForeground(Color.RED);
                  sizeLabel.setForeground(Color.RED);
                  fontLabel.setBounds(
          20,20,100,20);
                  faceLabel.setBounds(
          180,20,80,20);
                  sizeLabel.setBounds(
          260,20,50,20);
                  fonts.setBounds(
          10,40,127,21);
                  JScrollPane faceScroll
          =new JScrollPane(face);
                  JScrollPane sizeScroll
          =new JScrollPane(size);
                  faceScroll.setBounds(
          180,40,65,100);
                  sizeScroll.setBounds(
          260,60,50,80);
                  JPanel up
          =new JPanel(null);
                  JPanel center
          =new JPanel(new BorderLayout());
                  JPanel bottom
          =new JPanel();
                  up.setPreferredSize(
          new Dimension(345,160));
                  up.add(fontLabel);
                  up.add(faceLabel);
                  up.add(sizeLabel);
                  up.add(fonts);
                  up.add(faceScroll);
                  up.add(sizeScroll);
                  up.add(sizeJT);
                  up.setBorder(BorderFactory.createTitledBorder(
          "選擇區"));
                  center.add(demo,BorderLayout.CENTER);
                  center.setBorder(BorderFactory.createTitledBorder(
          "預覽區"));
                  bottom.add(ok);
                  bottom.add(cancel);
                  
          this.add(up,BorderLayout.NORTH);
                  
          this.add(center,BorderLayout.CENTER);
                  
          this.add(bottom,BorderLayout.SOUTH);
                  jd
          =new JDialog(owner,title,true);
                  jd.getContentPane().add(
          this,BorderLayout.CENTER);
                  jd.setSize(
          360,360);
                  jd.setResizable(
          false);
                  jd.setLocationRelativeTo(owner);
                  jd.addWindowListener(
          new WindowAdapter(){
                      
          public void windowClosing(WindowEvent we){
                          current
          =null;
                          jd.dispose();
                      }
                  });
                  jd.setVisible(
          true);
              }
              
          public void actionPerformed(ActionEvent ae){
                  
          if(ae.getSource()==fonts){
                      fontName
          =(String)fonts.getSelectedItem();
                      current
          =new Font(fontName,fontStyle,fontSize);
                      demo.setFont(current);
                      
          this.repaint();
                  }
          else if(ae.getSource()==ok){
                      jd.dispose();
                  }
          else if(ae.getSource()==cancel){
                      current
          =null;
                      jd.dispose();
                  }
              }
              
          public void valueChanged(ListSelectionEvent le){
                  
          if(le.getSource()==face){
                      String value
          =(String)face.getSelectedValue();
                      
          if(value.equals("正常")){
                          fontStyle
          =Font.PLAIN;
                      }
          else if(value.equals("粗體")){
                          fontStyle
          =Font.BOLD;
                      }
          else if(value.equals("斜體")){
                          fontStyle
          =Font.ITALIC;
                      }
          else if(value.equals("粗體+斜體")){
                          fontStyle
          =Font.ITALIC|Font.BOLD;
                      }
                      current
          =new Font(fontName,fontStyle,fontSize);
                      demo.setFont(current);
                      
          this.repaint();
                  }
          else if(le.getSource()==size){
                      String sizeName
          =(String)size.getSelectedValue();
                      sizeJT.setText(sizeName);
                      fontSize
          =ht.get(sizeName);
                      current
          =new Font(fontName,fontStyle,fontSize);
                      demo.setFont(current);
                      
          this.repaint();
                  }
              }
              
          public static Font showDialog(Frame owner,String title){
                  JFontChooser jf
          =new JFontChooser();
                  jf.initWindow(title);
                  
          return jf.current;
              }
             
          }




          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-08-30 10:22 千里冰封 閱讀(1618) 評論(1)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: 字體選擇器
          2007-08-30 12:39 | JAVA面試題
          這里也是博客園的嗎  回復  更多評論
            
          主站蜘蛛池模板: 茌平县| 榆社县| 讷河市| 承德县| 木里| 双峰县| 高尔夫| 贵州省| 平顺县| 东明县| 山阳县| 城市| 普陀区| 邵武市| 诸城市| 昌都县| 南阳市| 连平县| 蕉岭县| 河源市| 石城县| 阜南县| 汾阳市| 西乡县| 新密市| 清河县| 松滋市| 东港市| 富川| 长沙市| 铜山县| 和硕县| 德兴市| 楚雄市| 葫芦岛市| 普兰店市| 德州市| 宾阳县| 高台县| 平顺县| 文安县|