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的使用,以及触发事件的处理,再就是对于字体修改;

 

 

 

 

你可能感兴趣的:(java练习代码,心得经验)