【Java swing简易浏览器(其一)页面显示,超链接跳转与手动输入URL跳转】
【Java swing简易浏览器(其二)前进后退与收藏夹实现】
【java swing 简易浏览器(其三)下载器,智能搜索栏与邮件发送】
目录
前言
大作业继续。
之前的内容
【Java swing简易浏览器(其一)页面显示,超链接跳转与手动输入URL跳转】
【Java swing简易浏览器(其二)前进后退与收藏夹实现】
今天来实现最后几个功能。
实现思路
这里只介绍实现思路,代码的改动在【代码实现】部分
下载器
之前做了准备,我们使用之前写好的代码即可
我们在为JEditorPane组件绑定超链接事件的时候,跳转的时候判断一下地址是否合法
- 如果符合规格,即以http包头的content type是否是
text/html
,是则跳转 - 如果不符合,我们利用之前写好的下载器类,传入链接地址url并且打开下载器
智能搜索栏
我们知道,如果在浏览器的地址栏输入一些名词,而不是地址,浏览器会自动帮我们跳转到搜索页面。
了解这一点之后,我们在页面跳转之前,判断输入框的url是否符合规范,即以http打头,如果符合就跳转,否则修改链接,跳转到必应的搜索页面(百度的话,访问有bug)
关于必应搜索地址参数:
https://cn.bing.com/search?q=你要搜索的词汇
邮件发送
之前也造过类似的轮子
【Java socket通过smtp协议 向邮箱服务器请求以实现发送邮件】
我们在其基础上,加上图形界面即可。 图形界面的代码后面会放出。
代码实现
注意,以下代码的修改,都是基于上两次实验的代码来修改的,为了篇幅,我这里只放出修改的代码
完整代码在下面【完整代码】部分会贴出来
下载器
因为我们之前造过轮子了,所以使用以下语句就可以创建一个图形界面下载器。
MultiThreadDownloader dl = new MultiThreadDownloader(
hyplink,
"E:/MyEclipse/WorkSpace/Hello/src/homework/",
"下载",
3);
dl.download();
我们修改JEditorPane绑定超链接的事件的代码,修改为以下的代码:
// 添加超链接点击事件回调函数 并将JEditorPane的页面改为超链接的页面
jep.addHyperlinkListener(new HyperlinkListener() {
public void hyperlinkUpdate(HyperlinkEvent event) {
if(event.getEventType()==HyperlinkEvent.EventType.ACTIVATED) {
// 获取超链接目的地址
String hyplink = event.getURL().toString();
try {
// 判断content type 如果是text/html就访问 否则下载
String ctype = new URL(hyplink).openConnection().getContentType().substring(0, 4);
if(ctype.equals("text")) {
newPage(hyplink);
} else {
MultiThreadDownloader dl = new MultiThreadDownloader(
hyplink,
"E:/MyEclipse/WorkSpace/Hello/src/homework/",
"下载",
3);
dl.download();
}
} catch (Exception e) {
e.printStackTrace();
newPage(hyplink);
}
}
}
});
智能搜索栏
同样修改按下【点我访问网页】按钮的按下事件中执行的内容,我们判断输入是否是一个http链接,是则跳转,否则搜索
// 访问按钮 绑定访问按钮点击事件 从JTextField输入框获取URL并且访问
goBtn = new JButton("点我访问网页");
goBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 获取输入的地址栏的地址
String input = jtf.getText();
if(input.equals(curPage)) {
refreshPage();
} else if(input.length()>4 && input.substring(0, 4).equals("http")){
newPage(jtf.getText());
} else {
// 跳转到必应搜索
newPage("https://cn.bing.com/search?q=" + jtf.getText());
}
}
});
邮件发送
我们实现一个类专门来发邮件,叫做EmailSender,其中send方法是之前造轮子的时候就写过了,故我们为其封装一个新方法sendInWindow(),即利用图形界面发送邮件。
在sendInWindow方法里面,会调用send方法来真正发送邮件。
void sendInWindow() {
try {
destInputText = new JLabel("目的邮箱地址");
destInput = new JTextField("填写您的邮件目的地址");
textInputText = new JLabel("内容");
textInput = new JTextField("这是一封自动发送的邮件");
sendBtn = new JButton("发送");
sendBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
send("smtp.qq.com", destInput.getText(), textInput.getText());
sendBtn.setEnabled(false);
sendBtn.setText("发送成功");
} catch (Exception e1) {
e1.printStackTrace();
errcnt++;
sendBtn.setText("发送失败 点我重新发送 "+String.valueOf(errcnt));
}
}
});
JFrame jf = new JFrame("邮件发送");
jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
jf.setSize(768, 221);
jf.setLayout(new GridLayout(5, 1));
jf.add(destInputText);
jf.add(destInput);
jf.add(textInputText);
jf.add(textInput);
jf.add(sendBtn);
jf.show();
} catch(Exception e) {
e.printStackTrace();
}
}
在main函数中用两句话即可调用图形界面发送邮件
EmailSender sender = new EmailSender();
sender.sendInWindow();
如果要在浏览器处打开图形界面发送邮件,我们同样使用这两句就行。我们添加一个按钮来调出邮件窗口,并且绑定其按钮事件。
JButton emailBtn; // 以成员变量
// ------- 其他代码 ------//
emailBtn = new JButton("邮件发送");
emailBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
EmailSender sender = new EmailSender();
sender.sendInWindow();
}
});
完整代码
MyHtmlBrowser.java
/*
* @Author : @李若龙 2018171028 @SZU @CSSE
*/
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import java.util.regex.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.html.*;
public class MyHtmlBrowser {
String curPage = "http://www.szulrl.cn/browserTest";
JEditorPane jep; // html显示组件
JPanel menuBox; // 上方菜单栏box 装有很多按钮和输入框
JButton goBtn; // 【点我访问】按钮
JButton backBtn; // 回退按钮
JButton forwBtn; // 前进按钮
JButton refreshBtn; // 刷新按钮
JButton favoBtn; // 收藏夹按钮 点击调出收藏夹
JButton emailBtn; // 发送邮件
JTextField jtf; // 输入框
// 前进后退的栈 用双端队列实现
Deque<String> backQueue = new LinkedList<String>();
Deque<String> forwQueue = new LinkedList<String>();
MyHtmlBrowser() {
}
MyHtmlBrowser(String cp) {
curPage =