swingDemo

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);
  }
}

你可能感兴趣的:(swing)