小程序[邮箱提取器-EmailSplider]总结

1、背景情况

学东西做快的是付诸实践,写这个小程序的目的就是为了综合运用各个知识点,从而提升学习的效果。

2、涉及知识

A、Swing 的布局

B、Swing中,线程访问UI

C、URLConnection 读取网页源码

D、IO流的基本操作

E、正则表达式的基本使用

F、Window Builder插件的发现和使用

G、jar包的制作和双击jar运行的修复

H、jdk1.8的新特性,优雅的 lambda 语法

3、效果图

1、windows上运行效果 ↓

2、linux上运行效果 ↓

4、源代码

package test;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class EmailSplider extends JFrame {

    private static final long serialVersionUID = -2498717483036732605L;
    private JTextField txtHttpvtiebabaiducomp;
    private JTextArea txtrn;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    EmailSplider frame = new EmailSplider();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private String ReadHtml(URL txtUrl){

        StringBuffer sb = new StringBuffer();
        try {
            URLConnection conn =txtUrl.openConnection();
            BufferedReader bf = new BufferedReader( new InputStreamReader( conn.getInputStream(),"utf-8"));
            String str = null;
            while((str = bf.readLine()) != null){
                sb.append(str);
            }
            bf.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return sb.toString();
    }

    /**
     * Create the frame.
     */
    public EmailSplider() {
        setResizable(false);
        setTitle("\u90AE\u7BB1\u63D0\u53D6\u5668");
        setSize(663, 507);
        this.setLocationRelativeTo(null);  //居中窗体
        getContentPane().setLayout(null);

        JLabel label = new JLabel("\u8BF7\u8F93\u5165\u7F51\u5740");
        label.setBounds(10, 10, 71, 15);
        getContentPane().add(label);

        txtHttpvtiebabaiducomp = new JTextField();
        txtHttpvtiebabaiducomp.setText("http://v.tieba.baidu.com/p/3349997454");
        txtHttpvtiebabaiducomp.setBounds(82, 7, 493, 21);
        getContentPane().add(txtHttpvtiebabaiducomp);
        txtHttpvtiebabaiducomp.setColumns(10);

        JButton button = new JButton("\u63D0\u53D6");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new Thread( () -> {
                    try {
                        URL txtUrl = new URL(txtHttpvtiebabaiducomp.getText());
                        String html = ReadHtml(txtUrl);

                        Pattern p =Pattern.compile("[a-zA-Z0-9_-][email protected]\\w+\\.[a-z]+(\\.[a-z]+)?");
                        Matcher m = p.matcher(html);

                        while(m.find()){
                            //System.out.println(m.group());
                            try {
                                SwingUtilities.invokeAndWait(()->{
                                    txtrn.append(System.getProperty("line.separator")+m.group());
                                    txtrn.setCaretPosition(txtrn.getText().length());
                                });
                            } catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        }
                    } catch (MalformedURLException e1) {
                        JOptionPane.showMessageDialog(null, "请输入合法的网址!\n 必须以http:// 开头", "操作提示", JOptionPane.ERROR_MESSAGE);
                        return;
                    }
                }).start();
            }
        });
        button.setBounds(585, 6, 62, 23);
        getContentPane().add(button);        

        txtrn = new JTextArea();
        txtrn.setText("\u8FD9\u91CC\u663E\u793A\u63D0\u53D6\u7684\u90AE\u7BB1");
        txtrn.setLineWrap(true);

        JScrollPane jScrollPane = new JScrollPane(txtrn);
        jScrollPane.setBounds(10, 35, 637, 432);
        getContentPane().add(jScrollPane );

        jScrollPane.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    }
}

5、jar包附件

6、总结

Q1:SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()的区别(有什么区别)?

A1:invokeAndWait:后面的程序必须等这个线程(参数中的线程)的东西执行完才能执行;

invokeLater:后面的程序和这个参数的线程对象可以并行,异步地执行。

如果本程序代码里面由 invokeAndWait() 改为 invokeLater()  在ui上更新出来的结果会错乱的很离谱,但是控制台输出不会出现问题。

Q2:下面的代码,用jdk1.8 的 lambda 怎么写?

SwingUtilities.invokeLater( new Runnable() {
    @Override
    public void run() {
        txtrn.append(m.group()+System.getProperty("line.separator"));
        txtrn.setCaretPosition(txtrn.getText().length());
        }
    }
});

A2:写法如下,相当优雅!

  1. SwingUtilities.invokeAndWait(()->{
        txtrn.append(System.getProperty("line.separator")+m.group());
        txtrn.setCaretPosition(txtrn.getText().length());
    });
  2. Q3:怎么给JTextArea添加垂直滚动条?

A3:看代码里面和注释

txtrn = new JTextArea();
txtrn.setText("这里是内容");
txtrn.setLineWrap(true); //设置自动换行,让横向滚动条不显示

//用txtrn对象作为JScrollPane的构造方法的参数
JScrollPane jScrollPane = new JScrollPane(txtrn);
//下面setBounds很重要
jScrollPane.setBounds(10, 35, 637, 432);
//只需要把jScrollPane 添加到窗体,如果再添加txtrn对象就会乱。
getContentPane().add(jScrollPane );

Q4:提取邮箱的正则表达式怎么写?

A4:"[a-zA-Z0-9_-][email protected]\\w+\\.[a-z]+(\\.[a-z]+)?"

Q5、子线程如何更改UI?

A5、Swing中,提供了 SwingUtilities.invokeLater 和 SwingUtilities.invokeAndWait 方法来访问。

不过还是得注意这2个方法的区别!

Q6:如何导出jar包? 如何修复双击jar报错?如何安装比VE更强的Window Builder插件?

A6:前2个问题,在另外的笔记里面,后面的WB插件安装,只需要在  http://www.eclipse.org/windowbuilder/download.php 下载即可,安装及其的简单。

来自为知笔记(Wiz)

时间: 2024-10-14 20:58:54

小程序[邮箱提取器-EmailSplider]总结的相关文章

微信小程序api拦截器

微信小程序api拦截器 完美兼容原生小程序项目 完美兼用小程序api的原本调用方式,无痛迁移 小程序api全Promise化 和axios一样的请求方式 小程序api自定义拦截调用参数和返回结果 强大的async拦截 快速开始 安装 npm install wxapp-api-interceptors --save 详情 https://blog.csdn.net/rolan1993/article/details/80480341 原文地址:https://www.cnblogs.com/to

微信小程序——音频播放器

先来个效果图韵下味: 需求: 音频的播放,暂停,中间按钮状态的变化,播放时实时更新播放进度: 前进15s,后退15s: 进度条拖动. 一开始想着这3个功能应该挺简单的.不就是播放,暂停,前进,后退么~呵~写的时候发现自己还是太年轻.当然,这跟自己的技术功底有关系.现在把我遇到的难点及要注意的点说一下~ 需要设置一个名为seekPosition的全局变量,初始值为0.我们要在播放的时候实时记录播放的位置,存到该变量里,这是方便在前进15s 或 后退15s 时计算时间点. 前进15s时要判断剩余时间

微信小程序源码下载(200多个)

微信小程序源码下载汇总,点击标题进入对应的微信小程序下载页面. 最新 demo源码(点击标题进入帖子下载) 描述 1 微信小程序 会议室预定小程序 微信小程序 会议室预定小程序**** 本内容被作者隐藏 **** 2 微信小程序-双人五子棋小游戏 微信小程序-双人五子棋小游戏**** 本内容被作者隐藏 **** 3 打卡签到小程序 用微信小程序实现的一个简单的打卡签到的小程序拒绝 4 微信小程序---左滑删除 微信小程序---左滑删除**** 本内容被作者隐藏 **** 5 一个借钱的记事本的微

Python 小程序,对文件操作及其他

下面是自己写的几个对文件操作的小程序,里面涉及到文件操作,列表(集合,字典)的运用等.比如说,从文件中读取一行数据,分别存放于列表中,再对列表进行操作,如去掉里面的重复项,排序等操作. 常见对文件中行进行操作: #这里列出两个常用的方法 方法01: 一次性读取所有行 >>> f = file('1.txt') >>> while 1: lines = f.readlines() if not lines: break for line in lines: print l

Python 小程序,对文件操作及其它

以下是自己写的几个对文件操作的小程序,里面涉及到文件操作,列表(集合,字典)的运用等.比方说,从文件里读取一行数据.分别存放于列表中,再对列表进行操作.如去掉里面的反复项.排序等操作. 常见对文件里行进行操作: #这里列出两个经常使用的方法 方法01: 一次性读取全部行 >>> f = file('1.txt') >>> while 1: lines = f.readlines() if not lines: break for line in lines: print

微信小程序-整理各种小程序源码和资料免费下载

微信小程序整理下载 [小程序源码]微信小程序-车源宝微信版 [小程序源码]小程序-微赞社区(论坛demo) [小程序源码]微信小程序-收支账单 [小程序工具]微信小程序-日历 [小程序源码]小程序-在线聊天功能 [小程序源码]微信小程序-大好商城(新增功能天气查询和2048游戏) [小程序源码]微信小程序-查询号码归属地 [小程序源码]微信小程序-备忘录2 [小程序源码]微信小程序-QQ音乐 [小程序源码]小程序-货币汇率 [小程序源码]微信小程序-大学图书馆 [小程序源码]小程序-积分商城 [

微信小程序开发交流与推广

一.请加微信群: 请扫描下方的二维码加“微信小程序交流推广群”,由于微信群的限制,超过 100 人就不能扫码加群,大家可以先添加微信号:us9488 并备注“微信小程序”,然后拉你入群. 二.官方文档: 微信小程序介绍 微信小程序设计指南 微信小程序开发文档 微信小程序运营规范 微信小程序开发者社区 三.微信小程序解决方案: 微信小程序会话管理场景 微信小程序文件上传下载应用场景 微信小程序WebSocket长连接应用场景 微信小程序视频应用场景 四.代码: 会话管理场景 文件上传下载应用场景

微信小程序实例源码大全

怎么本地测试微信小程序实例源码 1.下载源码 2.打开微信开发者工具 3.添加项目->选择本项目目录->编译执行 微信小程序实例源码大全 微信小程序游戏类demo:识色:从相似颜色中挑选不同的一个 源码链接:http://www.wxapp-union.com/forum.php?mod=viewthread&tid=1105 微信小程序精品demo:仿网易云音乐:歌单,FM,播放,评论 源码链接:http://www.wxapp-union.com/forum.php?mod=vie

微信小程序源码案例大全

微信小程序demo:足球,赛事分析 小程序简易导航 小程序demo:办公审批 小程序Demo:电魔方 小程序demo:借阅伴侣 微信小程序demo:投票 微信小程序demo:健康生活 小程序demo:文章列表demo 微商城(含微信小程序)完整源码+配置指南 微信小程序Demo:一个简单的工作系统 微信小程序Demo:用于聚会的小程序 微信小程序Demo:Growth 是一款专注于Web开发者成长的应用,- 微信小程序Demo: Music-Player 微信小程序Demo:团贷网(投资) 微信