内容3:在内容2的基础上,用户点击登录注册窗体的登录按钮,到达商品信息查询的窗体,窗体如图3所示。
本次实验主要利用java类swing中的各种方法。
实验思路:通过实验所给出的窗口,使用swing中方法进行构建,并且各个窗口中的关联可以使用监视器来连接,最笨的方法就是创建各个窗口的类,通过监视器调用得出。
首先创建登录注册窗体:
可以看出是使用自定义的窗口布局NULL才可以达成,但是我是不熟练的,因此决定使用setLayout常用布局。通过分析发现需要建立三个JLabel(用户名,用户类型,密码),两个JTextField类(用于输入用户名和密码)一个下拉框JComboBox<String>,用于用户种类的选择,以及三个按钮JButton(登录,重置,点我注册),下面是详细代码
package shiyan11_2;
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
publi class SigninFrame extends JFrame {
//窗体上的组件
private JLabel l_username,l_userkind,l_password;
private JTextField t_username;
private JPasswordField p_password;
private JComboBox<String> u_userkind;
private JButton b_sgin, b_reset,b_Reginister;
public SigninFrame() { //设置窗体参数
this.setTitle("登录注册窗体");
this.setSize(500, 309);
this.setLocation(500, 300);
init();
this.setVisible(true);
}
public void init(){
this.setLayout(new GridLayout(5,2,2,5));
l_username = new JLabel("用户名",JLabel.CENTER);
l_userkind = new JLabel("用户类型",JLabel.CENTER);
l_password = new JLabel("密码",JLabel.CENTER);
t_username = new JTextField();
u_userkind = new JComboBox<String>();
u_userkind.addItem("请选择:");u_userkind.addItem("管理员");u_userkind.addItem("普通用户");
p_password = new JPasswordField();
b_sgin = new JButton("登录");
b_sgin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new inquire();
}
});
b_reset = new JButton("重置");
b_reset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
t_username.setText("");
u_userkind.setSelectedIndex(0);
p_password.setText("");
}
});
b_Reginister = new JButton("点我注册");
b_Reginister.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
new RegisterFrame();
}
});
this.add(l_username);
this.add(t_username);
this.add(l_userkind);
this.add(u_userkind);
this.add(l_password);
this.add(p_password);
this.add(b_sgin);
this.add(b_reset);
this.add(b_Reginister);
}
}
其中重置的地方需要一个监听器,达到点击该按钮,会重置(清空或者回复初态)。在重置中有setSelectedIndex()方法,作用是恢复到下拉框的第几个,我的0位初态,所以输入了0.
然后点我注册需要引出一个新框——注册界面,这里我直接新建RegisterFrame类来调用。
下面是RegisterFrame类的代码:
package shiyan11_2;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class RegisterFrame extends JFrame {
//窗体上的组件
private JLabel l_id, l_name, l_password1, l_password2, l_sex, l_city;
private JTextField t_id, t_name;
private JPasswordField p_password1, p_password2;
private JRadioButton r_male, r_female;
private JComboBox<String> c_city;
private JButton b_reg, b_reset;
public RegisterFrame() {
this.setTitle("电商购物平台_注册界面");
this.setSize(500, 309);
this.setLocation(500, 300);
init();
this.setVisible(true);
}
public void init() {
this.setLayout(new GridLayout(7,2,2,5));
l_id = new JLabel("账号",JLabel.CENTER);
l_name = new JLabel("姓名",JLabel.CENTER);
l_password1 = new JLabel("密码",JLabel.CENTER);
l_password2 = new JLabel("确认密码",JLabel.CENTER);
l_sex = new JLabel("性别",JLabel.CENTER);
l_city = new JLabel("城市",JLabel.CENTER);
t_id = new JTextField();
t_name = new JTextField();
p_password1 = new JPasswordField();
p_password2 = new JPasswordField();
r_male = new JRadioButton("男");
r_female = new JRadioButton("女");
ButtonGroup bg = new ButtonGroup();
bg.add(r_male);
bg.add(r_female);
JPanel p = new JPanel();
p.add(r_male);
p.add(r_female);
c_city = new JComboBox<String>();
c_city.addItem("请选择:");
c_city.addItem("河北");c_city.addItem("山东");c_city.addItem("辽宁");
c_city.addItem("黑龙江");c_city.addItem("吉林");c_city.addItem("甘肃");
c_city.addItem("青海");c_city.addItem("河南");c_city.addItem("江苏");
c_city.addItem("湖北");c_city.addItem("湖南");c_city.addItem("江西");
c_city.addItem("浙江");c_city.addItem("广东");c_city.addItem("云南");
c_city.addItem("福建");c_city.addItem("台湾");c_city.addItem("海南");
c_city.addItem("山西");c_city.addItem("四川");c_city.addItem("陕西");
c_city.addItem("贵州");c_city.addItem("安徽");
c_city.addItem("北京");c_city.addItem("天津");c_city.addItem("上海");
c_city.addItem("重庆");c_city.addItem("内蒙古自治区");c_city.addItem("广西壮族自治区");
c_city.addItem("西藏自治区");c_city.addItem("宁夏回族自治区");c_city.addItem("新疆维吾尔族自治区");
c_city.addItem("香港特别行政区");c_city.addItem("澳门特别行政区");
b_reg = new JButton("注册");
//添加时间监听器,事件源点击有效,收集用户信息并展示
b_reg.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 完成注册功能,从窗口收集用户信息,并且展示
String id = t_id.getText();
String name = t_name.getText();
String password1 = new String( p_password1.getPassword());
String password2 = new String( p_password2.getPassword());
//两次密码不一致处理
if(!password1.equals(password2)) {
//shwoMessage();
JOptionPane.showMessageDialog(p_password2, "两次输入的密码不一致!!","Error!",JOptionPane.WARNING_MESSAGE);
p_password1.setText("");
p_password2.setText("");
return;
}
char sex = ' ';
if(r_male.isSelected()) {
sex = '男';
}else {sex = '女';}
String city = (String)c_city.getSelectedItem();
//用模型封装收集到的信息
User u = new User(id, name, password1, sex, city, "");
//展示信息
new UserInfoFrame(u);
}
});
b_reset = new JButton("重置");
b_reset.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
t_id.setText("");
t_name.setText("");
p_password1.setText("");
p_password2.setText("");
bg.clearSelection();
c_city.setSelectedIndex(0);
}
});
this.add(l_id);
this.add(t_id);
this.add(l_name);
this.add(t_name);
this.add(l_password1);
this.add(p_password1);
this.add(l_password2);
this.add(p_password2);
this.add(l_sex);
this.add(p);
// this.add(r_male);
// this.add(r_female);
this.add(l_city);
this.add(c_city);
this.add(b_reg);
this.add(b_reset);
}
}
这里需要说一下就是重置的方法,需要用到上面的setSelectedIndex(0)以及一个新的方法clearSelection,改方法的作用是取消所有选择,在这里可以取消掉对于bg里的男女选择。
这里的注册监视器内用到了MVC模型:
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
- Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) - 视图代表模型包含的数据的可视化。
- Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
- Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) - 视图代表模型包含的数据的可视化。
- Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
下面是模型的代码,
package shiyan11_2;
//MVC中的m(模型),用来封装数据。
public class User {
private String id;
private String name;
private String password;
private char sex;
private String city;
private String type;
public User(String id, String name, String password, char sex, String city, String type) {
super();
this.id = id;
this.name = name;
this.password = password;
this.sex = sex;
this.city = city;
this.type = type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + ", sex=" + sex + ", city=" + city
+ ", type=" + type + "]";
}
}
注册的监视器中要求输出表
这里建立了类,通过调用实现
package shiyan11_2;
import javax.swing.*;
public class UserInfoFrame extends JFrame {
private JTable t_user;
public UserInfoFrame(User u) {
//窗体初始化
this.setTitle("电商购物平台_用户信息");
this.setSize(500, 309);
this.setLocation(500, 300);
init(u);
this.setVisible(true);
}
public void init(User u) {
Object[][] user = {{u.getId(),u.getName(),u.getPassword(),u.getSex(),u.getCity()}};
Object[] colName = {"用户名","姓名","密码","性别","城市"};
t_user = new JTable(user,colName);
this.add(new JScrollPane(t_user));
}
}
最后加入测试类,看看本次实验的效果!
首先是主界面的重置,输入内容,并且选择了用户类型后,点击重置回到初始状态。
点击注册,弹出新的窗口:
测试注册界面的重置,输入内容,并且选择了性别和城市后,点击重置回到初始状态。
测试注册功能:输入不同的密码:
弹出错误警告。
测试注册成功:
试用登录功能,后弹出一个查询框,设计不太完善,希望看到的同学,可以互相交流借鉴。
与伙伴们共勉!