字体选择器
字体选择器其实也是挺常用的,可是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;
}
}
* 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的浓香.