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.獲取用戶添加的信息並存儲到硬盤;