仿qq登陆界面

来源:互联网 发布:西岐网络 编辑:程序博客网 时间:2024/05/09 18:13

package login.qq;

 

import java.awt.EventQueue;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.io.Writer;

 

import javax.swing.JButton;

import javax.swing.JCheckBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

import javax.swing.border.EmptyBorder;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

 

import org.w3c.dom.Document;

import org.xml.sax.SAXException;

 

public class LoginJFrame extends JFrame {

 

/**

 *对xml文件进行查询和修改

 */

private static final long serialVersionUID = 1L;

private JPanel contentPane;

private JTextField textField_name;

private JTextField textField_pass;

private JCheckBox checkBox_rpass;

private JCheckBox checkBox_auto;

 

/**

 * Launch the application.

 */

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

LoginJFrame frame = new LoginJFrame();

frame.setVisible(true);

catch (Exception e) {

e.printStackTrace();

}

}

});

}

 

/**

 * Create the frame.

 */

public LoginJFrame() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 450, 300);

contentPane = new JPanel();

contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);

contentPane.setLayout(null);

 

JLabel label_name = new JLabel("用户名");

label_name.setBounds(64, 45, 54, 15);

contentPane.add(label_name);

 

JLabel label_pass = new JLabel("密码");

label_pass.setBounds(64, 92, 54, 15);

contentPane.add(label_pass);

 

textField_name = new JTextField();

textField_name.setBounds(128, 42, 113, 21);

contentPane.add(textField_name);

textField_name.setColumns(10);

 

textField_pass = new JTextField();

textField_pass.setBounds(128, 89, 113, 21);

contentPane.add(textField_pass);

textField_pass.setColumns(10);

/*

 * // 初始化数据 initData();一会得挪位置,移动登录上面

 */

 

checkBox_rpass = new JCheckBox("记住密码");

checkBox_rpass.setBounds(85, 139, 103, 23);

contentPane.add(checkBox_rpass);

 

checkBox_auto = new JCheckBox("自动登录");

//点击事件

checkBox_auto.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

//判断自动登录是否被选中

if(checkBox_auto.isSelected()){

//设置记住密码也要选中

checkBox_rpass.setSelected(true);;

}

}

});

checkBox_auto.setBounds(190, 139, 103, 23);

contentPane.add(checkBox_auto);

// 初始化数据

initData();

 

JButton btn_login = new JButton("登录");

btn_login.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

// 记录用户名与密码和记录是否自动登录

remberPassAndAuto();

}

 

private void remberPassAndAuto() {

// 首先获取用户名和密码

String name = textField_name.getText();

String pass = textField_pass.getText();

 

if ("".endsWith(name)) {

System.out.println("请填写用户名");

else {

 

if ("".equals(pass)) {

System.out.println("请填写密码");

else {

// 判断密码是否记录并且自动登录是否记录

if (checkBox_rpass.isSelected()

&& checkBox_auto.isSelected()) {

 

writeXml(name, pass, "true");

else if (checkBox_rpass.isSelected()) {

writeXml(name, pass, "false");

else {

System.out.println("不需要记录密码,也不需要自动登录");

}

}

}

}

 

/**

 * 创建xml文件

 * 

 * @param name

 * @param pass

 * @param auto

 */

private void writeXml(String name, String pass, String auto) {

// 保存

File file = new File("rem.xml");

/**

 * 因为每次登录都会重新写入文件,所以要判读文件是否存在,如果存在就不需要重写了,用下面的代码直接记录已有文件

 下面的代码是执行修改的方法

 */

//文件是否存在

if (file.exists()) {

//判断是否记录密码与自动登录,若记录,看看有必要修改不修改xml文件

try {

//获取文本后需要判断,若记录了密码可以直接判断了

if(checkBox_rpass.isSelected()){

//是否记录了密码

Document document = getDocument(file);

//获取用户名和密码,这都是新的

String rname=document.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();

String rpass=document.getElementsByTagName("pass").item(0).getFirstChild().getNodeValue();

String rauto=document.getElementsByTagName("auto").item(0).getFirstChild().getNodeValue();

//判断用户名是否相同

if(!name.equals(rname)){

//如果不相同才进行修改,首先也获取名字,再用setNodeValue()方法修改

document.getElementsByTagName("name").item(0).getFirstChild().setNodeValue(name);

//另一种方法document.getElementsByTagName("name").item(0).setTextContent(name);

}

//判断密码是否相同

if(!pass.equals(rpass)){

document.getElementsByTagName("pass").item(0).getFirstChild().setNodeValue(pass);

//另一种方法document.getElementsByTagName("pass").item(0).setTextContent(pass);

}

//判断自动登录是否被改变了

if(!auto.equals(rauto)){

document.getElementsByTagName("auto").item(0).getFirstChild().setNodeValue(auto);

}

//进行处理

Transformer transformer=TransformerFactory.newInstance().newTransformer();

//重新写入,transform对象中的source方法,soruce中又有Domsource方法

transformer.transform(new DOMSource(document), new StreamResult(file));

}

/*//获取文本

Document document = getDocument(file);*/

//这种抛出异常的方式相当于抛出三次异常

catch ( Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

else {

 

// 写文件输出流

try {

Writer writer = new FileWriter(file);

writer.write("<?xml version='1.0' encoding='UTF-8'?>");

writer.write("<user><name>" + name + "</name><pass>"

+ pass + "</pass><auto>" + auto

"</auto></user>");

writer.close();

catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

});

btn_login.setBounds(64, 193, 93, 23);

contentPane.add(btn_login);

 

JButton btn_reset = new JButton("重置");

btn_reset.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

System.out.println("重置的效果");

}

});

btn_reset.setBounds(200, 193, 93, 23);

contentPane.add(btn_reset);

 

JLabel lblQq = new JLabel("qq登陆界面");

lblQq.setBounds(316, 10, 86, 25);

contentPane.add(lblQq);

}

 

/**

 * 初始化用户名与密码

 */

private void initData() {

File file = new File("rem.xml");

if (file.exists()) {

// 设置记录密码为选中状态

checkBox_rpass.setSelected(true);

// 用dom解析文件

try {

Document document = getDocument(file);

/*

 * 开始解析,直接获取用户名,通过getElementsByTagName方法,但是得到的是个集合,

 * 文件中只有一个name字段,用.item(0)方法得到第一个值,这时得到

 * 是name元素节点,但是要得到文本节点,文本节点是元素节点的孩子用(getFirstChild)方法得到,再用

 * getNodeValue来得到值

 */

// 直接获取用户名

String rname = document.getElementsByTagName("name").item(0)

.getFirstChild().getNodeValue();

// 赋值,通过textField方法

textField_name.setText(rname);

// 直接获取密码

String rpass = document.getElementsByTagName("pass").item(0)

.getFirstChild().getNodeValue();

// 赋值

textField_pass.setText(rpass);

// 直接获取登录的值

String rauto = document.getElementsByTagName("auto").item(0)

.getFirstChild().getNodeValue();

// 如果登录的值为真那么就显示自动登录已勾上

if ("true".equals(rauto)) {

checkBox_auto.setSelected(true);

// 当自动登录已勾上时,页面会停留几秒钟,就会自动消失,所以要开启一个线程

/*

 * new Thread(){ public void run() { try {

 * Thread.sleep(5000); // 休息5秒后就拿着你记录的用户名和密码去登陆,这是窗体消失

 * System.exit(0); } catch (InterruptedException e) { //

 * TODO Auto-generated catch block e.printStackTrace(); } };

 * }.start();

 */

}

 

catch (ParserConfigurationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

catch (SAXException e) {

// TODO Auto-generated catch block

e.printStackTrace();

catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

else {

return;

}

}

 

private Document getDocument(File file)

throws ParserConfigurationException, SAXException, IOException {

// 获取DocumentBuilder对象(回头改到别的地方去),DocumentBuilderFactory创建一个Document工厂

DocumentBuilder db = DocumentBuilderFactory.newInstance()

.newDocumentBuilder();

// 获取文档对象,用db.parse方法存放文件,然后获取文档对象

Document document = db.parse(file);

return document;

}

}

 

0 0
原创粉丝点击