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.獲取用戶添加的信息並存儲到硬盤;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章