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.获取用户添加的信息并存储到硬盘;