字体选择器其实也是挺常用的,可是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