package com.tarena.elts.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
/**
* 登录窗口
*/
public class LoginFrame extends JFrame {
// 定义控制层
private ClientContext clientContext;
//定义两个输入框,可以在不同方法间共享
private JTextField idField;
private JPasswordField pwdField;
//用于显示系统提示信息
private JLabel message;
public void setClientContext(ClientContext clientContext) {
this.clientContext = clientContext;
}
public LoginFrame() {
init();
}
/**
* 初始化界面
* 该方法将初始化窗口的所有组件
*/
private void init() {
//设置标题
setTitle("登录系统");
//设置大小
setSize(260,200);
//设置居中显示
setLocationRelativeTo(null);
//设置窗口内部元素,setContentpanel()为JFrame定义的
setContentPane(creatContentPanel());//panel会占满整个窗口
}
private JPanel creatContentPanel(){
/**
* JPanel的重载构造函数JPanel(BorderLayout()
* 可以指定JPanel的布局管理器
* Layoutmanager是所有布局的父类
*/
JPanel panel=new JPanel(new BorderLayout());
//给panel加一个边框,使其与外边框有一定的间距
/*
* EmptyBorder是Border的子类,是一个透明的边框
* 其构造方法都需要传入4个int,分别是上 左 下 右的间距
*/
panel.setBorder(new EmptyBorder(4,4,4,4));
//北面放一个label
panel.add(
//使用JLabel的重载方法,可以指定内容剧中显示
new JLabel("登录系统",JLabel.CENTER),
BorderLayout.NORTH
);
//中间存放两个label和两个输入框的Jpanel
panel.add(creatCenterpane(),BorderLayout.CENTER);
//下方存放两个按钮
panel.add(createBtnpane(),BorderLayout.SOUTH);
return panel;
}
/*
* 该panel放在中间,但是只有北面有内容
* 分为两行,一行输入编号
* 一行输入密码
*/
private JPanel creatCenterpane(){
JPanel panel=new JPanel(new BorderLayout());
panel.setBorder(new EmptyBorder(8,8,8,8));
//在中间的panel中的北面添加密码和编号 组件a
panel.add(createIdOrPwdpane(),BorderLayout.NORTH);
/**
* CENTER:显示系统的提示信息
*/
message=new JLabel("",JLabel.CENTER);
panel.add(message,BorderLayout.CENTER);
return panel;
}
private JPanel createIdOrPwdpane(){
JPanel panel=new JPanel(new GridLayout(2,1,0,6));
//在中间的panel中的北面添加组件b,两行一列//后两个参数是水平间距和垂直间距
panel.add(creatIdPanel());//第一行放编号和输入框的JPanel
panel.add(creatPwdpanel());//第二行放密码输入况的JPanel
return panel;
}
/*
* 第一行加入编号的输入框Panel
*/
private JPanel creatIdPanel(){
JPanel panel=new JPanel(new BorderLayout(6,0));
//左面 label 编号
panel.add(new JLabel("编号"),BorderLayout.WEST);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
idField=new JTextField();
//在东面加入输入框
panel.add(idField,BorderLayout.CENTER);
return panel;
}
/*
* 第二行加入密码输入框
*/
private JPanel creatPwdpanel(){
JPanel panel=new JPanel(new BorderLayout(6,0));
//左面 label 密码
panel.add(new JLabel("密码"),BorderLayout.WEST);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
pwdField=new JPasswordField();
/*
* 我们允许输入法的输入
*/
pwdField.enableInputMethods(true);
//在东面加入密码输入框
panel.add(pwdField,BorderLayout.CENTER);
return panel;
}
/*
* 在底部放的包含按钮panel
*/
private JPanel createBtnpane(){
JPanel panel=new JPanel();//!!!!!!!!!!!!!!!!!!!!!!!
JButton login=new JButton("Login");
login.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//当用户点击按钮后,调用控制层
clientContext.login();
}
});
JButton cancel=new JButton("Cancel");
panel.add(login);
panel.add(cancel);
return panel;
}
/**
* 为配合控制层完成登录的流程,提供两个方法,使得控制层可以获得
* 密码 id
*/
public int getUserId(){
//获取输入框中的内容
//转换成整形的
return Integer.parseInt(idField.getText());
}
public String getUserPwd(){
//getPassword()方法只能得到字符数组,需要转换成字符串
return new String(pwdField.getPassword());
}
//在登录窗口上 显示错误信息
public void showError(String meg){
//为显示错误信息的label设置错误信息
message.setText(meg);
//将文字的颜色改为红色
message.setForeground(Color.red);
/**
* 使用timer结合窗口坐标,实现窗口的晃动的效果
*/
final Timer timer=new Timer();
//1、保存当前窗口所在的坐标
Point p=this.getLocation();//返回的Pointion实例
//给timer添加一个任务,用于周期性运动
timer.schedule(new TimerTask(){
int []offset={0,4,8,4,0,-4,-8,-4};
int index=0;
public void run(){
Point p=getLocation();
p.x+=offset[index++];
if(index==7){
index=0;
}
setLocation(p);
}
},0,100);//间隔100毫秒
//让窗口停止运动的任务
timer.schedule(new TimerTask(){
public void run(){
timer.cancel();
}
}, 2000);
}
}