问题描述:编写一个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的使用,以及触发事件的处理,再就是对于字体修改;