由于课程设计的缘故,提前做了个身份证查询小工具。

技术含量并不高,"出生日期、性别、年龄"都是根据身份证的算法算出来的,身份证号码18位数对应不同的含义,大家百度查一下即可。

"发证地区"理论上也可以算出来,但是地区数据过于庞大,短时间内写出来是不可能的,看了下java的网络编程和爬虫技术,也参考了网上一些代码,抓取的是ip138的网页,然后返回地区结果。

对于正则表达式和网络编程方面的知识只学了两条天时间,因为还没有深入,正则表达式写得特别烂,但是能正确抓取所要的信息,见谅

GUI方面,为了方便,安装了WindowBuilder插件。

代码引用了两个图片,一个是icon,一个是label定义的背景图片,在此不上传了,大家进行替换或者删减即可

package Idcard;import java.awt.EventQueue;import javax.swing.JFrame;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Window.Type;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import javax.swing.JTextField;
import java.awt.Font;
import java.awt.Toolkit;import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;public class IdIdentify {private JFrame frame;private JTextField tf_idInput;private JLabel lb_background;private JLabel lb_idTips;private JLabel lb_birth1;private JLabel lb_birth2;private JLabel lb_sex1;private JLabel lb_sex2;private JLabel lb_age1;private JLabel lb_age2;private JLabel lb_adress1;private JLabel lb_adress2;String id_String_18;//身份证最后一位数int id_int_18;int[] id_int=new int[17];//身份证前17位int[] id_digit={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {IdIdentify window = new IdIdentify();window.frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/*** Create the application.*/public IdIdentify() {initialize();}/*** Initialize the contents of the frame.*/private void initialize() {frame = new JFrame();frame.setIconImage(Toolkit.getDefaultToolkit().getImage(IdIdentify.class.getResource("/Idcard/icon.png")));frame.setResizable(false);frame.setTitle("身份证号码查询工具");frame.setBounds(100, 100, 571, 405);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().setLayout(null);//窗口居中Toolkit tk=frame.getToolkit();Dimension dm=tk.getScreenSize();frame.setLocation((int)(dm.getWidth()-frame.getWidth())/2, (int)(dm.getHeight()-frame.getHeight())/2);JLabel lb_idNumber = new JLabel("身份证号码:");lb_idNumber.setForeground(Color.WHITE);lb_idNumber.setFont(new Font("宋体", Font.BOLD, 20));lb_idNumber.setBounds(91, 49, 126, 18);frame.getContentPane().add(lb_idNumber);tf_idInput = new JTextField();tf_idInput.setBounds(236, 42, 223, 33);frame.getContentPane().add(tf_idInput);tf_idInput.setColumns(10);//限制输入长度,且只能输入0-9的数字或者大小写Xtf_idInput.addKeyListener(new KeyAdapter() {public void keyTyped(KeyEvent e) {if(e.getKeyChar()==KeyEvent.VK_ENTER){if(rekonInput()){if(rekonLastNumber()){lb_idTips.setText(null);lb_birth2.setText(getbirthDay());lb_age2.setText(getAge()+"");lb_sex2.setText(getSex());lb_adress2.setText(getIdLocation());}else{lb_idTips.setText("身份证号码有误");lb_birth2.setText(null);lb_age2.setText(null);lb_sex2.setText(null);lb_adress2.setText(null);}}        }char c=e.getKeyChar();if(tf_idInput.getText().length()<17){if(c>'9'||c<'0')e.consume();                  }else if(tf_idInput.getText().length()==17){if(!(c=='X'||c=='x'||(c>='0'&&c<='9'))){e.consume();}}else e.consume();}});tf_idInput.addFocusListener(new FocusListener() {public void focusLost(FocusEvent e) {rekonInput();lb_idTips.setText(null);}public void focusGained(FocusEvent e) {lb_idTips.setText(null);}});JButton bt_check = new JButton("查询");bt_check.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if(rekonInput()){if(rekonLastNumber()){lb_idTips.setText(null);lb_birth2.setText(getbirthDay());lb_age2.setText(getAge()+"");lb_sex2.setText(getSex());lb_adress2.setText(getIdLocation());}else{lb_idTips.setText("身份证号码有误");lb_birth2.setText(null);lb_age2.setText(null);lb_sex2.setText(null);lb_adress2.setText(null);}}     }});bt_check.setBounds(137, 300, 113, 27);frame.getContentPane().add(bt_check);lb_idTips = new JLabel("");lb_idTips.setFont(new Font("宋体", Font.BOLD, 17));lb_idTips.setForeground(Color.RED);lb_idTips.setBounds(236, 76, 240, 24);frame.getContentPane().add(lb_idTips);lb_birth1 = new JLabel("出生日期:");lb_birth1.setForeground(Color.WHITE);lb_birth1.setFont(new Font("宋体", Font.BOLD, 20));lb_birth1.setBounds(112, 112, 113, 18);frame.getContentPane().add(lb_birth1);lb_birth2 = new JLabel("");lb_birth2.setForeground(Color.WHITE);lb_birth2.setFont(new Font("宋体", Font.BOLD, 18));lb_birth2.setBounds(236, 112, 223, 18);frame.getContentPane().add(lb_birth2);lb_sex1 = new JLabel("性    别:");lb_sex1.setForeground(Color.WHITE);lb_sex1.setFont(new Font("宋体", Font.BOLD, 20));lb_sex1.setBounds(110, 152, 113, 18);frame.getContentPane().add(lb_sex1);lb_sex2 = new JLabel("");lb_sex2.setForeground(Color.WHITE);lb_sex2.setFont(new Font("宋体", Font.BOLD, 18));lb_sex2.setBounds(236, 152, 223, 18);frame.getContentPane().add(lb_sex2);lb_age1 = new JLabel("年    龄:");lb_age1.setForeground(Color.WHITE);lb_age1.setFont(new Font("宋体", Font.BOLD, 20));lb_age1.setBounds(110, 192, 113, 18);frame.getContentPane().add(lb_age1);lb_age2 = new JLabel("");lb_age2.setForeground(Color.WHITE);lb_age2.setFont(new Font("宋体", Font.BOLD, 18));lb_age2.setBounds(236, 192, 223, 18);frame.getContentPane().add(lb_age2);lb_adress1 = new JLabel("发证地区:");lb_adress1.setForeground(Color.WHITE);lb_adress1.setFont(new Font("宋体", Font.BOLD, 20));lb_adress1.setBounds(112, 232, 113, 18);frame.getContentPane().add(lb_adress1);lb_adress2 = new JLabel("");lb_adress2.setForeground(Color.WHITE);lb_adress2.setFont(new Font("宋体", Font.BOLD, 18));lb_adress2.setBounds(236, 232, 315, 18);frame.getContentPane().add(lb_adress2);JButton bt_clear = new JButton("\u6E05\u7A7A");bt_clear.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {tf_idInput.setText(null);lb_birth2.setText(null);lb_age2.setText(null);lb_sex2.setText(null);lb_adress2.setText(null);}});bt_clear.setBounds(316, 300, 113, 27);frame.getContentPane().add(bt_clear);lb_background = new JLabel("");lb_background.setIcon(new ImageIcon(IdIdentify.class.getResource("/Idcard/background.jpg")));lb_background.setBounds(0, -21, 573, 398);frame.getContentPane().add(lb_background);}//判断身份证号码最后一位是否正确public boolean rekonLastNumber(){int sum=0;String lastNum="";for(int i=0;i<id_int.length;i++){sum+=id_int[i]*id_digit[i];}switch(sum%11){case 0:lastNum="1";break;case 1:lastNum="0";break;case 2:lastNum="X";break;case 3:lastNum="9";break;case 4:lastNum="8";break;case 5:lastNum="7";break;case 6:lastNum="6";break;case 7:lastNum="5";break;case 8:lastNum="4";break;case 9:lastNum="3";break;case 10:lastNum="2";break;}if(lastNum.equalsIgnoreCase(id_String_18))return true;else return false;}//输入判断public boolean rekonInput(){String id=tf_idInput.getText();if(id.length()!=18){lb_idTips.setText("输入长度有误!");lb_birth2.setText(null);lb_age2.setText(null);lb_sex2.setText(null);lb_adress2.setText(null);return false;}else{String[] id_String=id.split("");//将输入的身份证号转为长度为18的字符串数组for(int i=0;i<id_String.length;i++){try{if(i<17){id_int[i]=Integer.parseInt(id_String[i]);}else{if(id_String[i].equalsIgnoreCase("X")){id_String_18=id_String[i].toUpperCase();}else{id_int_18=Integer.parseInt(id_String[i]);id_String_18=id_String[i].toUpperCase();}}}catch(NumberFormatException e1){lb_idTips.setText("请输入正确的身份证号码!");return false;}}return true;}}//获取出生日期public String getbirthDay(){String date=tf_idInput.getText().substring(6, 14);String year=date.substring(0, 4);String month=date.substring(4, 6);String day=date.substring(6, 8);return year+"年"+month+"月"+day+"日";}//获取年龄public int getAge(){Calendar c=Calendar.getInstance();int birth_Year=Integer.parseInt(tf_idInput.getText().substring(6, 10));return c.get(Calendar.YEAR)-birth_Year;}//获取性别public String getSex(){int sex=Integer.parseInt(tf_idInput.getText().substring(16,17));if(sex%2==1) return "男";else return "女";}//爬虫:抓取ip138的查询结果String getIdLocation(){String result ="";try{URL url = new URL("http://qq.ip138.com/idsearch/index.asp?action=idcard&userid="+tf_idInput.getText());HttpURLConnection httpuc=(HttpURLConnection)url.openConnection();BufferedReader br = new BufferedReader(new InputStreamReader(httpuc.getInputStream(),"gb2312")) ;String html_Content="";String content;while((content=br.readLine())!=null){html_Content+=content;}//利用正则表达式获取户籍信息String regex="\\u53D1 \\u8BC1 \u5730\\uFF1A</td><td class=\"tdc2\">([\u4e00-\u9fa5]*\\s*[\u4e00-\u9fa5]*\\s*[\u4e00-\u9fa5]*\\s*[\u4e00-\u9fa5]*\\s*)";Pattern pattern=Pattern.compile(regex);Matcher matcher=pattern.matcher(html_Content);if(matcher.find()){result=matcher.group(1);}else result="查询失败";br.close();}catch(Exception e){result="未联网状态下,无法查询发证地区!";}return result;}
}

基于java GUI编写的身份证查询小工具相关推荐

  1. 基于Java Swing编写的简易运费计算工具

    两年前给媳妇儿做的一个基于Java Swing编写的简易运费计算工具,现开源,关键是思路(https://github.com/honghailiang/FreightSystem).主要有两个部分实 ...

  2. java包裹邮费计算_GitHub - honghailiang/FreightSystem: 基于Java Swing编写的简易运费计算工具...

    FreightSystem 基于java Swing编写的运费计算系统 初始化数据 从excel中读取数据,转化为对象(只保存基础数据:序列号.始发站.目的站.省份.100kg以下(元/kg).100 ...

  3. 基于java springboot的小说阅读微信小程序含后台管理系统源码

    系统运行环境 开发工具 eclipse(idea),mysql5.7(大于5.5),navicat,小程序开发工具 硬件要求 windows操作系统 cpu:2.4GHz 内存:4G 硬盘:100G ...

  4. 【图像去噪】基于matlab GUI butterworth+中值+维纳+小波图像去噪【含Matlab源码 520期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像去噪]基于matlab GUI butterworth+中值+维纳+小波图像去噪[含Matlab源码 520期] 获取代码方式2: ...

  5. java gui论文_毕业设计论文-基于JAVA GUI的电子邮件客户端软件的设计与实现.doc

    毕业设计论文-基于JAVA GUI的电子邮件客户端软件的设计与实现.doc 还剩 41页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧, ...

  6. 基于Java Swing编写的运费计算系统

    基于Java Swing编写的运费计算系统,主要有两个部分实现:1)初始化数据  2)用swing绘制系统并执行业务逻辑 一.初始化数据 从excel中读取数据,转化为对象(只保存基础数据:序列号.始 ...

  7. java源码聊天软件_【原创】基于Java NIO的多人在线聊天工具源码实现(登录,单聊,群聊)...

    近来在学习Java NIO网络开发知识,写了一个基于Java NIO的多人在线聊天工具MyChat练练手.源码公开在Coding上: 编写一个基于Java NIO的多人在线聊天工具,需要以下几方面的知 ...

  8. 给Clouderamanager集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解)...

    不多说,直接上干货! 这个很简单,在集群机器里,选择就是了,本来自带就有Impala的. 扩展博客 给Ambari集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解) 欢迎大 ...

  9. 笔顺、拼音查询小工具推介

    笔顺.拼音查询小工具推介 文/项有建 活码笔顺.拼音查询小工具,是几年笔者在活码公司时所编写的一款非常实用的小作品,用它可很方便地查询汉字的笔顺码和拼音,是一款学习笔画输入法和拼音的实用工具,这是一个 ...

最新文章

  1. 报告视频录制:腾讯会议录屏+人像画中画特效
  2. python 判断点在随机多边形内_初中数学必须掌握的28个考点及60个易错点,收藏起来慢慢看!...
  3. 计算机专业是否限制语种,高考日语选什么专业(如果高考选日语,大学选专业有什么限制)...
  4. ①你真的学会Java了吗?来自《卷Ⅰ》的灵魂提问
  5. java udp 协议_网络协议 - UDP 协议详解
  6. 【转】sqlserver使用sql导出索引
  7. 7、扫雷游戏地雷数计算
  8. 64位ubuntu能安装mysql数据库_Ubuntu操作系统下安装MySQL数据库的方法
  9. 笔试题--你准备好了吗
  10. 更靠谱的横竖屏检测方法
  11. 机器学习读书笔记:样本降维
  12. 最优化方法笔记-线性规划(大M法与两阶段法)
  13. java正则表达式的减号_JAVA正则表达式
  14. udhcpc 后台运行的方法
  15. 在线旅游发展趋势分析
  16. 利用envi进行监督分类(支持向量机)
  17. 【博主推荐】html好看的邀请函(附源码)
  18. unity实现简单fps游戏功能
  19. 【声卡宿主】ProTools 2021.7.0使用安装教程
  20. 糖价回暖,甩掉包袱的南宁糖业能跑多快?

热门文章

  1. 学习人工智能AI路线
  2. Cisco无线网技术之AP的配置
  3. 阿里入职的第一年,这是你想要的职场生活吗?
  4. opencv图像分类方法汇总
  5. python-flask-SAE微信公众号
  6. 使用原生js实现吸顶功能
  7. 强酸和激光可破解iPhone手机加密数据
  8. 爱奇艺八年:“好人”龚宇和“宽容先生”李彦宏
  9. 食品安全大于天,盘点食品加工行业劳保防护用品有哪些
  10. 23种设计模式的学习