千里冰封
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 千里冰封 阅读(1616) 评论(1)  编辑  收藏 所属分类: JAVASE

FeedBack:
# re: 字体选择器
2007-08-30 12:39 | JAVA面试题
这里也是博客园的吗  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: