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