* 作 者: 刘镇
* 完成日期: 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的使用,以及触发事件的处理,再就是对于字体修改;