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