Java里Swing的用户信息注册窗口案例实战练习代码(10)

1、先看下要最终要实现的窗口界面设计

在这里插入图片描述

2.开始编码,以下是参考代码

package top.linksinke.demo;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.UUID;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

/**
 * 用户注册窗体示例<br/>
 * create by LINKSINKE on 2020/3/1
 */
public class UserRegisterTest extends JFrame {
	public UserRegisterTest() {
		this.setTitle("用户信息注册");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(300, 30, 400, 650);

		Container ctainer = this.getContentPane();
		ctainer.setLayout(null);

		// 头像
		JLabel lbImg = new JLabel("");
		lbImg.setBounds(170, 10, 70, 60);
		lbImg.setBorder(BorderFactory.createLineBorder(Color.GRAY));
		ctainer.add(lbImg);
		/**
		 * 设置文本标签的鼠标监听事件<br/>
		 * mouseReleased:鼠标按键被释放时被触发<br/>
		 * mousePressed:鼠标按键被按下时被触发<br/>
		 * mouseExited:鼠标移出组件时被触发<br/>
		 * mouseEntered:鼠标移入组件时被触发<br/>
		 * mouseClicked:发生单击事件时被触发(不管是不是按下还是释放,只要点了就触发该事件)
		 */
		lbImg.addMouseListener(new MouseListener() {
			@Override
			public void mousePressed(MouseEvent e) { }
			@Override
			public void mouseExited(MouseEvent e) { }
			@Override
			public void mouseEntered(MouseEvent e) { }

			@Override
			public void mouseClicked(MouseEvent e) {
				JOptionPane.showMessageDialog(UserRegisterTest.this, "就当做成打开文件吧。。");
			}
			
			@Override
			public void mouseReleased(MouseEvent e) { }
		});

		// 编号
		JLabel lbId = new JLabel("编号");
		lbId.setBounds(50, 80, 30, 20);
		final JTextField txtId = new JTextField();
		txtId.setBounds(100, 80, 220, 20);
		ctainer.add(lbId);
		txtId.setEnabled(false);
		txtId.setDisabledTextColor(Color.RED);// 设置禁用的文本颜色
		txtId.setText(genderId());
		ctainer.add(txtId);

		// 姓名
		JLabel lbName = new JLabel("姓名");
		lbName.setBounds(50, 115, 30, 20);
		final JTextField txtName = new JTextField();
		txtName.setBounds(100, 115, 220, 20);
		ctainer.add(lbName);
		ctainer.add(txtName);

		// 性别
		JLabel lbGender = new JLabel("性别");
		lbGender.setBounds(50, 150, 30, 20);
		JPanel pGender = new JPanel();
		// 流式布局:radio组件显示在居中位置,radio组件和panel组件之间的水平间距30,radio组件和panel组件之间的垂直间隙-1
		pGender.setLayout(new FlowLayout(FlowLayout.CENTER, 30, 0));
		pGender.setBounds(100, 150, 220, 20);
		pGender.setBorder(BorderFactory.createLineBorder(Color.GRAY)); // 面板的边框为灰色
		final JRadioButton rd1 = new JRadioButton("男");
		final JRadioButton rd2 = new JRadioButton("女");
		final ButtonGroup bgGender = new ButtonGroup();
		bgGender.add(rd1);
		bgGender.add(rd2);
		pGender.add(rd1);
		pGender.add(rd2);
		ctainer.add(lbGender);
		ctainer.add(pGender);

		// 年龄
		JLabel lbAge = new JLabel("年龄");
		lbAge.setBounds(50, 185, 30, 20);
		final JComboBox comboAge = new JComboBox();
		comboAge.setBounds(100, 185, 220, 20);
		comboAge.addItem("--请选择--");
		for (int i = 1; i < 61; i++) {
			comboAge.addItem(i + "岁");
		}
		comboAge.setSelectedIndex(0);// 默认选择名称为“--请选择--”的下拉选项
		ctainer.add(lbAge);
		ctainer.add(comboAge);

		// 爱好
		JLabel lbHobbies = new JLabel("爱好");
		lbHobbies.setBounds(50, 220, 30, 20);
		final List<JCheckBox> jCheckBoxs = new ArrayList<JCheckBox>();
		// 存放复选框的面板
		JPanel pnck = new JPanel();
		pnck.setLayout(new GridLayout(6, 3)); // 设置布局方式为网格布局(6行3列)
		String[] hobbies = { "爬山", "打碟", "听音乐", "写小说", "翻译", "暴走", "购物", "跳舞", "推理", "华容道", "滑雪", "模仿", "走秀", "K歌",
				"喝酒", "抽烟", "发呆", "其他" };
		for (int i = 0; i < hobbies.length; i++) {
			JCheckBox ckboxHobbies = new JCheckBox(hobbies[i]);
			jCheckBoxs.add(ckboxHobbies);
			pnck.add(ckboxHobbies);
		}

		/**
		 * <strong>垂直的滚动条设置常量</strong>
		 * ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED:需要多少值才会出现垂直方向的滚动条<br/>
		 * ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER:不出现垂直方向的滚动条<br/>
		 * ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS:始终出现垂直方向的滚动条<br/>
		 * <strong>水平的滚动条设置常量</strong>
		 * ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED:需要多少值才会出现水平方向的滚动条<br/>
		 * ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER:不出现水平方向的滚动条<br/>
		 * ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS:始终出现水平方向的滚动条
		 */
		// 下面的滚动条设置的是:垂直方向的滚动条将总是会显示出来的,而水平方向的滚动条是将永远不会显示出来的
		JScrollPane spHobbies = new JScrollPane(pnck, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		spHobbies.setBounds(100, 220, 220, 100);
		ctainer.add(lbHobbies);
		ctainer.add(spHobbies);

		// 密码
		JLabel lbPwd = new JLabel("密码");
		lbPwd.setBounds(50, 335, 30, 20);
		final JPasswordField pwd = new JPasswordField();
		pwd.setBounds(100, 335, 220, 20);
		pwd.setEchoChar('\u2601');// 设置显示的字符
		ctainer.add(lbPwd);
		ctainer.add(pwd);

		// 确认密码
		JLabel lbPwdOk = new JLabel("确认密码");
		lbPwdOk.setBounds(25, 370, 60, 20);
		final JPasswordField pwdOk = new JPasswordField();
		pwdOk.setBounds(100, 370, 220, 20);
		pwdOk.setEchoChar('\u2601');// 设置显示的字符
		ctainer.add(lbPwdOk);
		ctainer.add(pwdOk);

		// 联系地址
		JLabel lbAddr = new JLabel("联系地址");
		lbAddr.setBounds(25, 405, 60, 20);
		final JTextArea txtAddr = new JTextArea();
		txtAddr.setLineWrap(true);// 是否自动换行(true代表支持自动换行,false代表不支持自动换行)
		// 同爱好的滚动条设置,也是垂直方向的滚动条是一直显示出来的,而水平方向的滚动条是永远不会显示出来的
		JScrollPane spAddr = new JScrollPane(txtAddr, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		spAddr.setBounds(100, 405, 220, 60);
		ctainer.add(lbAddr);
		ctainer.add(spAddr);

		// 个人简介
		JLabel lbIntro = new JLabel("个人简介");
		lbIntro.setBounds(25, 480, 60, 20);
		final JTextArea txtIntro = new JTextArea();
		/**
		 * 是否支持自动换行,如果为true表示会自动换行,fasle就不会自动换行<br/>
		 * 自动换行,也就是水平方向的文字将不会一直写下去,而会到达边界进行回车出来,产生一条空行
		 */
		txtIntro.setLineWrap(true);
		// 垂直方向的滚动条将会一直显示,而水平方向的滚动条将永不再显示出来的
		JScrollPane spIntro = new JScrollPane(txtIntro, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		spIntro.setBounds(100, 480, 220, 60);
		ctainer.add(lbIntro);
		ctainer.add(spIntro);

		// 提交
		JButton btnSub = new JButton("提交");
		btnSub.setBounds(120, 560, 70, 20);
		JButton btnReset = new JButton("清空");
		btnReset.setBounds(200, 560, 70, 20);
		btnReset.setBackground(Color.YELLOW);
		ctainer.add(btnSub);
		ctainer.add(btnReset);

		btnSub.addActionListener(new ActionListener() {
			// 特别说明:没有做空值判断
			@Override
			public void actionPerformed(ActionEvent e) {
				StringBuffer sbHobbies = new StringBuffer();
				StringBuffer gender = new StringBuffer();
				// 爱好获取
				for (JCheckBox ckb : jCheckBoxs) {
					if (ckb != null && ckb.isSelected()) {
						sbHobbies.append(ckb.getText() + ",");
					}
				}
				// 性别获取
				Enumeration<AbstractButton> lb = bgGender.getElements();
				while (lb.hasMoreElements()) {
					AbstractButton rb = lb.nextElement();
					if (rb.isSelected()) {
						gender.append(rb.getText());
					}
				}

				String str = String.format("姓名:%s\n性别:%s\n年龄:%s\n爱好:%s\n密码:%s\n确认密码:%s\n联系地址:%s\n个人简介:%s\n",
						txtName.getText(), gender.toString(), comboAge.getSelectedItem(), sbHobbies.toString(),
						String.valueOf(pwd.getPassword()), String.valueOf(pwdOk.getPassword()), txtAddr.getText(),
						txtIntro.getText());
				writeFileToDisk(txtId.getText(), str);
			}
		});
		btnReset.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {

				txtId.setText(genderId());// 重新生成编号
				txtName.setText("");// 清空姓名文本框的内容
				txtAddr.setText("");// 清空联系地址文本域的内容
				txtIntro.setText("");// 清空个人简介文本域的内容
				pwd.setText("");// 清空密码密码框的内容
				pwdOk.setText("");// 清空确认密码密码框的内容
				comboAge.setSelectedIndex(0);// 重新选择“--请选择--”
				// 取消所有选中的爱好复选框
				for (JCheckBox ckb : jCheckBoxs) {
					if (ckb.isSelected()) {
						ckb.setSelected(false);
					}
				}
				// 如果性别男或者性别女单选按钮选中就将其设置为未选中
				// 需要注意,没有勾选时的情况,这种情况获取到的对象是null的
				if (bgGender.getSelection() != null && bgGender.getSelection().isSelected()) {
					bgGender.clearSelection();
				}
				JOptionPane.showMessageDialog(UserRegisterTest.this, "清空完毕...");
			}
		});

		this.setVisible(true);
	}

	private String genderId() {
		UUID uuid = UUID.randomUUID();
		return uuid.toString().replace("-", "");
	}

	/**
	 * 写数据到磁盘中
	 * 
	 * @param fileName
	 *            文件名称
	 * @param data
	 *            文件数据
	 */
	private void writeFileToDisk(String fileName, String data) {
		File file = new File("c:\\" + fileName);
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		// 写文件
		try {
			// 创建写文件的流
			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
			// 写数据到文件
			writer.write(data.toString());
			writer.flush();
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String args[]) {
		JFrame jframe = new UserRegisterTest();
	}
}

3、用代码最终实现的界面效果

在这里插入图片描述


窗口运行后的功能测试:
在这里插入图片描述

  • 待完成的功能:
    1.头像上传未完成;
    2.在进行提交操作时没有处理用户未输入的情况;
    3.在进行提交操作时没有处理用户信息是否合格的情况(比如密码和确认密码不一致这种),同时包含非法信息录入;
    4.在提交操作完成后时没有进行清空内容;
  • 已完成的功能:
    1.用户窗体的绘制;
    2.获取用户添加的信息并存储到硬盘;
发布了68 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_29001539/article/details/104592188
今日推荐