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_-]+@\\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_-]+@\\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 下载即可,安装及其的简单。

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

  1. 微信小程序自运营器 微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营)

    自动发单,自动评价,自动评论,自动推广 微信小程序自运营器  微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营) 我们会根据你的微信公众号或微信小程序定制开发带有一定AI智 ...

  2. 微信小程序api拦截器

    微信小程序api拦截器 完美兼容原生小程序项目 完美兼用小程序api的原本调用方式,无痛迁移 小程序api全Promise化 和axios一样的请求方式 小程序api自定义拦截调用参数和返回结果 强大 ...

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

    先来个效果图韵下味: 需求: 音频的播放,暂停,中间按钮状态的变化,播放时实时更新播放进度: 前进15s,后退15s: 进度条拖动. 一开始想着这3个功能应该挺简单的.不就是播放,暂停,前进,后退么~ ...

  4. 微信小程序音乐播放器

    写在前面 1.入门几天小白的作品,希望为您有帮助,有好的意见或简易烦请赐教 2.微信小程序审核音乐类别已经下架,想要发布选题需慎重.附一个参考链接,感谢https://www.hishop.com.c ...

  5. 小程序拾色器(颜色选择器)组件mini-color-picker

    特性: 现有方案分析 we-color-picker 需注意组件定位,操作不跟手不流畅,配置复杂.其定位会撑开原有页面,体验不佳.滑动距离按像素区分(固定),需考虑设备分辨率,不利于多端. Papae ...

  6. 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台

    支付宝小程序-MQTT模拟器通过WSS接入阿里云IoT物联网平台 小程序效果: 1. 准备工作 1.1 注册阿里云账号 开通阿里云账号,并通过支付宝实名认证 https://www.aliyun.co ...

  7. UWP_开源小程序 水印添加器

    前几天写了一个确定水印位置的小博客.决定要写一个添加水印的UWP程序. 目前程序技术方面已经差不多了.所以提上日程

  8. 微信小程序音乐播放器组件

    wxml <image bindtap="click" src="{{isPlay?'/images/':'/images/'}}"/> JS Pa ...

  9. 微信小程序踩坑集合

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

随机推荐

  1. DIV+CSS一些小小的技巧

    DIV+CSS网页布局技巧实例1:设置网页整体居中的代码 以前用表格布局时设置网页居中非常方便,把表格对齐方式设置为居中就行了,就这么简单,现在呢,用DIV+CSS样式表控制,好像不是那么容易了,其实 ...

  2. 2017-01-20_dp测试

    题目:http://files.cnblogs.com/files/shenben/2017-01-20problems.pdf 数据包(含解题报告):http://files.cnblogs.com ...

  3. Future 异步回调 大起底之 Java Future 与 Guava Future

    目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...

  4. 移动App该怎样保存用户password

    版权声明:本文为横云断岭原创文章,未经博主同意不得转载.微信公众号:横云断岭的专栏 https://blog.csdn.net/hengyunabc/article/details/34623957 ...

  5. (转)JavaScript中==和===的区别

    ==   用于比较   判断 两者相等      ==在比较的时候可以转自动换数据类型 ===用于严格比较   判断两者严格相等     ===严格比较,不会进行自动转换,要求进行比较的操作数必须类型 ...

  6. Java互斥语义的实现

    锁 对象头(Object Header) HotSpot 虚拟机的对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针)   Mark Word 用于存储对象自 ...

  7. Spring Boot2.0之多数据源事务管理

    结合前面做的小项目,如果我把test01 test02下面的 service 都加了 事务的注解 这样启动时候会报错! 事务管理器里面不能有两个事务!!!! 这时候需要用  @Transactiona ...

  8. cad定制快捷键

    1.工具-自定义-编辑程序参数,改好之后,关闭. 2.在命令行输入:reinit-选择PGP文件-确定.

  9. 15 个最佳的 jQuery 布局插件【转】

    英文原文:15 Best jQuery Grid Plugins for Developers 现如今,网站开发设计的需求会要求自动适应所有移动设备,即响应式网站: 在开发网站时必须考虑对平板设备融合 ...

  10. python-常用内置函数与装饰器

    1.常用的python函数 abs             求绝对值 all               判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any          ...