Java程序設計(十五)----用戶在對話框下拉列表中選擇的爲顯示文本區中的文本

* 程序的版權和版本聲明部分
* 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的使用,以及觸發事件的處理,再就是對於字體修改;

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章