* 作 者: 刘镇
* 完成日期: 2012 年 11 月 25 日
* 版 本 号: 2.015
* 对任务及求解方法的描述部分
* 问题描述:编写一个FontFamily类,该类对象获取当前机器可用的全部字体名称。编写一个对话框FontDialog,该对话框是模式对话框,采用BorderLayout布局,包含一个JComboBox放在北面显示全部字体的名称,包含一个JLabel放在中间,显示字体的效果,包含两个按钮放在南面,点击YES,在对话框所依赖的窗口中设置字体的效果,点击Cancle取消。编写一个窗口FrameHaveDialog,该窗口有一个按钮和一个文本区,当单击该按钮时,弹出对话框FontDialog,然后根据用户在对话框下拉列表中选择的为显示文本区中的文本。最后编写一个程序执行入口进行测试。
*代码部分:
FontFamily:
package lz_13w;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
/*
* FontFamily:获取系统中所有字体GraphicEnvironment这是一个抽象类,不能直接实例化。
* getAvailableFontFamilyNames():返回一个包含此 GraphicsEnvironment 中所有字体系列名称的数组
* String[]fontName数组获得字体名称字符串数组;
*/
public class FontFamily {
String[] fontName;
FontFamily()
{
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
fontName = e.getAvailableFontFamilyNames();
}
}
FontDialog:
package lz_13w;
import java.awt.BorderLayout;
import java.awt.Dialog;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
/*
*弹出的有模式对话框的设置: 通过一个循环实现对JComboBox中下拉项的添加;
*其中的Font myFont用于获取label中的字体;
*处理ActionPreformed事件:不论触发事件的是YES还是Cancel都是将对话框的可见性SetVisible(false)设为false,只不过在
*处理YES时要将myFont赋值为label的字体----(用于在主窗口中的输入数据字体改变时使用)
*处理itemStateChanged(ItemEvent e):用i 获得当前选中的下拉项的索引:
*label.setFont(new Font(fontFamily.fontName[i], Font.PLAIN, this.getFont().getSize()));
*通过setFont()设置字体,通过new Font具体改变字体,其中参数分别是: 字体名称、 Font 的样式常量、字体大小。
*/
public class FontDialog extends Dialog implements ActionListener, ItemListener{
Panel panelSouth;
JComboBox box;
JLabel label;
JButton button1, button2;
FontFamily fontFamily;
Font myFont;
public FontDialog(Frame f, String s, boolean b)
{
super(f, s, b);
setTitle("字体选择窗口");
setLayout(new BorderLayout());
fontFamily = new FontFamily();
panelSouth = new Panel();
button1 = new JButton("YES");
button1.addActionListener(this);
button2 = new JButton("Cancle");
button2.addActionListener(this);
panelSouth.add(button1);
panelSouth.add(button2);
box = new JComboBox();
for(int i = 0; i < fontFamily.fontName.length; i++)
{
box.addItem(fontFamily.fontName[i]);
}
box.addItemListener(this);
label = new JLabel("Choice your font! 选择你的字体!");
add(box, BorderLayout.NORTH);
add(label, BorderLayout.CENTER);
add(panelSouth, BorderLayout.SOUTH);
setBounds(60, 60, 300, 300);
setVisible(false);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button1)
{
myFont = label.getFont();
setVisible(false);
}
else
{
setVisible(false);
}
}
public void itemStateChanged(ItemEvent e) {
int i = box.getSelectedIndex();
label.setFont(new Font(fontFamily.fontName[i], Font.PLAIN, this.getFont().getSize()));
}
}
FrameHaveDialog:
package lz_13w;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
/*
* 实现窗口:actionPreformed():当按button时触发弹出有模式对话框,当进行选择后将label的字体效果即myFont进行当前输入字符的字体改变;
* 因为若点击对话框中的Cancel和系统默认字体一致,不改变字体;
*/
public class FrameHaveDialog extends JFrame implements ActionListener{
FontDialog dialog;
JButton fontButton;
JTextArea text;
public FrameHaveDialog() {
dialog = new FontDialog(this, "字体选择", true);
dialog.setBounds(450, 200, 240, 250);
fontButton = new JButton("选字体");
fontButton.addActionListener(this);
text = new JTextArea();
setLayout(new BorderLayout());
setVisible(true);
setBounds(450, 200, 300, 350);
add(fontButton, BorderLayout.NORTH);
add(text, BorderLayout.CENTER);
setTitle("我的字体框");
setExtendedState(Frame.MAXIMIZED_VERT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e) {
dialog.setVisible(true);
text.setFont(dialog.myFont);
}
}
TestDialog:
package lz_13w;
public class TestDialog {
/**
* @param args
*/
public static void main(String[] args) {
new FrameHaveDialog();
}
}
测试结果:
心得经验:
一、关键内容已经在注释中写明:关键是FontFamily的使用,以及触发事件的处理,再就是对于字体修改;