java 自制对话框

概要:

本实例介绍如何定义适合自己的组件,本实例自定义一个对话框,在对话框中输入文本,单击“确定”按钮后将输入的文本显示到主窗口中,当单击“保存”按钮时,会将主窗口中的内容保存到通过文件对话框选择的文件中。

| |目录

技术要点

自制对话框的技术要点如下:

  • 文本域JTextArea可以显示多行文本,可以使用append()方法向文本域中追加内容。

  • 自定义对话框继承JDialog,通过JDialog的setVisible方法显示和隐藏自定义对话框。

  • 通过JFileChooser创建一个文件选择器。

  • 通过JFileChooser对象的showSaveDialog方法可以弹出一个保存的对话框。

代码实现

package net.xsoftlab.baike;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
 * 使用对话框。 功能介绍:界面包括一个文本域,一个添加按钮和一个保存按扭,单击添加按钮弹出一个对话框,
 * 在对话框中输入的字符串将在文本域中显示,单击保存按扭弹出一个保存对话框,将文本域保存在指定的方件 中,若该文件不存在,则自动创建文件并保存
 */
public class DialogDemo extends JFrame implements ActionListener {
	private Simple_Dialog simple_dialog;// 声明Simple_Dialog类对象
	private JTextArea area;// 声明JTextArea变量
	String lineSeparator; // 文本域中行之间的分隔符
	public DialogDemo() {
		super("对话框示例");// 调用父类的构造方法
		area = new JTextArea(5, 30);// 创建一个能显示5行30个字符的文本域。
		area.setEditable(false);// 文本域的状态为不可修改
		JMenuBar bar = new JMenuBar();// 创建一个空的菜单栏
		getContentPane().add("North", bar);// 将菜单栏添加到容器中
		getContentPane().add("Center", new JScrollPane(area));// 将带滚动条的文本添加到容器中
		JButton button = new JButton("添加内容");// 添加一个按钮,单击按钮弹出对话框
		button.setActionCommand("b1");// 设置激发操作事件的命令名称为b1
		button.addActionListener(this);// 添加单击侦听事件
		JButton saveButton = new JButton("保存");// 同理
		saveButton.setActionCommand("save");// 同理
		saveButton.addActionListener(this);// 同理
		JPanel panel = new JPanel();// 创建一个JPanel对象
		// 将按扭添加到面板中
		panel.add(button);
		panel.add(saveButton);
		getContentPane().add("South", panel);
		// 获取文本域中行之间的分隔符。这里调用了系统的属性
		lineSeparator = System.getProperty("line.separator");
		this.pack(); // 调整窗体布局大小
	}
	public void actionPerformed(ActionEvent event) {
		// 单击按钮时根据不同的命令名称进行不同的操作
		File file;// 声明File对象
		if (event.getActionCommand().equals("b1")) {// 如果单击添加按扭
			if (simple_dialog == null) {// 弹出一个对话框
				simple_dialog = new Simple_Dialog(this, "输入对话框");
			}
			simple_dialog.setVisible(true);// 设置对话框可见
		}
		if (event.getActionCommand().equals("save")) {// 如果单击保存按扭
			JFileChooser fc = new JFileChooser();// 创建一个文件选择器
			fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);// 设置文件选择模式
			fc.setDialogType(JFileChooser.SAVE_DIALOG);// 设置对话框类型
			fc.showSaveDialog(this);// 弹出一个 "Save File" 文件选择器对话框。
			try {
				file = fc.getSelectedFile();// 返回选中的文件
				if (!file.exists()) {// 判断该方件是否存在
					file.createNewFile();// 若不存在则创建
				}
				String s = area.getText();// 返回文本区域中的内容
				FileOutputStream fou = new FileOutputStream(file);// 创建一个文件输出流
				byte[] by = s.getBytes();// 将子符串转换成字节数组
				fou.write(by);// 将字节数组中的内容写入指定的文件中
			} catch (Exception e) {
			}
		}
	}
	public void setText(String text) {
		area.append(text + lineSeparator);// 添加内容到文本域的后面,每次都新起一行。
	}
	public static void main(String args[]) {
		DialogDemo window = new DialogDemo();
		window.setVisible(true);
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
/**
 * 自定义对话框 对话框包括一个label、一个文本框和2个按钮。
 */
class Simple_Dialog extends JDialog implements ActionListener {
	JTextField text; // 文本框,用于输入字符串
	DialogDemo p; // 对话框的父窗体。
	JButton comfig; // “确定”按钮
	/** 构造函数,参数为父窗体和对话框的标题 */
	Simple_Dialog(JFrame prent_Frame, String title) {
		// 调用父类的构造函数,
		// 第三个参数用false表示允许激活其他窗体。为true表示不能够激活其他窗体
		super(prent_Frame, title, false);
		p = (DialogDemo) prent_Frame;
		// 添加Label和输入文本框
		JPanel pl = new JPanel();
		JLabel label = new JLabel("请输入要添加的文本:");
		pl.add(label);
		text = new JTextField(30);
		text.addActionListener(this);
		pl.add(text);
		getContentPane().add("Center", pl);
		// 添加确定和取消按钮
		JPanel pl1 = new JPanel();
		pl1.setLayout(new FlowLayout(FlowLayout.RIGHT));
		JButton cancelButton = new JButton("取 消");
		cancelButton.addActionListener(this);
		comfig = new JButton("确 定");
		comfig.addActionListener(this);
		pl1.add(comfig);
		pl1.add(cancelButton);
		getContentPane().add("South", pl1);
		pack(); // 调整对话框布局大小
	}
	/** 事件处理 */
	public void actionPerformed(ActionEvent event) {
		Object source = event.getSource();
		if ((source == comfig)) {
			// 如果确定按钮被按下,则将文本矿的文本添加到父窗体的文本域中
			p.setText(text.getText());
		}
		text.selectAll();
		setVisible(false); // 隐藏对话框
	}
}

程序解读

Simple_Dialog类

  1. 自定义组件必须继承一个标准的组件,在标准组件上进行功能改进比自己完全写一个组件容易得多。Simple_Dialog继承JDialog,使得主窗口可以调用Simple_Dialog的setVisible方法控制何时显示、隐藏对话框。

  2. 自定义组件的构造方法必须先调用父类的构造方法。super(prent-Frame,title,false);语句初始化了JDialog对象,其中第三个参数为false表示该对话框不是总在最前,即当对话框被显示时,可以激活程序中的其他窗口;当第三个参数为true时,表示该对话框始终在最前,不能够激活其他窗口。

  3. ActionEvent的getSource方法可以获得事件发生的源对象。如果是“确定”按钮被单击,则调用主窗口的setText方法,传入对话框中文本框的文本,在父窗口的setText方法中通过JTextArea的append方法将传入的文本追加显示在文本域中。

DialogDemo类

  1. DialogDemo类继承JFrame实现ActionListener,在自身的构造方法中,可以调用父类的构造方法“super("对话框示例");”语句初始化JFrame对象。

  2. 在actionPerformed方法中,ActionEvent的getActionCommand()可以得到标识事件命令的字符串标志。如果是“保存”按钮被单击,则创建文件选择器,根据选择的路径创建文件对象,然后通过FileOutputStream写入文件对象中。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消