* Copyright (c) 2012, 煙臺大學計算機學院學生
* All rights reserved.
* 作 者: 劉鎮
* 完成日期: 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的使用,以及觸發事件的處理,再就是對於字體修改;