📄 webclientui.java
字号:
package web.http.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.text.EditorKit;
import javax.swing.text.html.HTMLDocument;
/**
* WEB浏览器实现
*
* 实现功能:
* 1.通过设定的URL地址访问web页面(仅支持标准HTML,不支持CSS,JS等)
* 2.浏览刷新
* 3.向前向后浏览页面
* 4.收藏夹功能
* 5.打开文件
* 6.保存文件
* 7.搜索功能:向服务器发送搜索请求:http://host/?searchContent
*
* 访问web页面的实现:
* *使用控件:JEditorPane,使用该控件提供的方法:taContent.setPage(url)
* *
* *或者如下方法组合:
* *URL urlURL=new URL(url);
* *taContent.setContentType("text/html");
* *EditorKit ek = taContent.getEditorKitForContentType("text/html");
* *HTMLDocument doc = (HTMLDocument) ek.createDefaultDocument( );
* *taContent.read(urlURL.openStream(),doc);
*
* *本系统同时使用了两种方法。
* *因为taContent.setPage(url)存在缺陷:无法进行刷新
* *而第二种方法亦存在缺陷:访问某些页面时会抛出NullPointerException(猜测有可能是因为下载的页面不是标准的HTML所致)
* *故将两种方法结合使用::一般情况采用第二种方法访问web页面,抛出异常后,再采用第一种方法setPage.
* *由于web页面的显示速度较慢,因此,设计了一个内部线程AccessInternet,在线程内部访问页面
*
*
* 浏览刷新:
* 重新连接该页面即可
* 比较好的想法是:发送一个请求,如果该页面没有被更新,则不需要重新下载页面
* 如果该页面已经被更新,则重新下载该页面并显示
* 但是本系统并没有这样做,只是简单的重新连接该页面
*
* 向前向后浏览页面:
* 使用循环队列实现。将访问过的URL地址和页面保存到两个循环队列urlList和contentList中
* 向后则将指针后移一位,向前则将指针前移一位
*
* 收藏夹功能:
* 收藏夹每一项应包含两个属性:名称与URL地址
* 将每个对应项保存到文件favorites.dat中
* 显示时,读取该文件,将名称以菜单的形式显示
*
* 打开文件
* 保存文件略去
*
*
* 仅能发送GET请求
*/
public class WebClientUI extends JFrame implements ActionListener,
KeyListener
{
JPanel contentPane;
BorderLayout borderLayout1 = new BorderLayout();
JPanel panelAll = new JPanel();
BorderLayout borderLayout2 = new BorderLayout();
JEditorPane taContent = new JEditorPane();
JScrollPane scroll = new JScrollPane(taContent);
JLabel labStatus = new JLabel();
JPanel panelSite = new JPanel();
//文本框 接受URL地址的输入
JTextField urlSite = new JTextField();
BorderLayout borderLayout3 = new BorderLayout();
//按钮 接受用户单击事件和键盘事件
JButton bAccess = new JButton();
//菜单栏
JMenuBar menuBar = new JMenuBar();
//文件菜单
JMenu mFile = new JMenu();
//打开文件菜单
JMenuItem mOpen = new JMenuItem();
//保存文件菜单
JMenuItem mSave = new JMenuItem();
//另存文件菜单
JMenuItem mSaveAs = new JMenuItem();
//退出系统 菜单
JMenuItem mExit = new JMenuItem();
//功能菜单
JMenu mFunction = new JMenu();
//后退菜单
JMenuItem mBack = new JMenuItem();
//前进菜单
JMenuItem mPrevious = new JMenuItem();
//收藏夹菜单
JMenu mFavorites = new JMenu();
//查找菜单
JMenuItem mFind = new JMenuItem();
//添加到收藏夹菜单
JMenuItem mAddFavorites = new JMenuItem();
//刷新菜单
JMenuItem mRefresh = new JMenuItem();
//哈希表,保存收藏夹内容
Hashtable favorites=new Hashtable();
//URL地址缓存
String[] urlList=new String[10];
//文本内容缓存
String[] contentList=new String[10];
//当前位置
int curPositon=-1;
//后退步数
int backPositon=0;
//访问页面统计计数
//后退的时候,后退的步数不能超过访问的页面次数
long accseTime=0;
//标志
//如果前一步所做的动作是浏览页面,将被设置为1
//如果前一步所做的动作是其他动作,将被设置为2
int flag=0;
private SearchInfoUI searchUI=null;
/**
* 构造函数
*
*/
public WebClientUI()
{
initUI();
}
/**
* 布局界面
*
*/
private void initUI()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JFrame.setDefaultLookAndFeelDecorated(true);
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setTitle("Web浏览器");
panelAll.setLayout(borderLayout2);
panelAll.setBorder(BorderFactory.createLineBorder(Color.black));
taContent.setContentType("text/html");
taContent.setBorder(null);
taContent.setDisabledTextColor(Color.black);
taContent.setEditable(false);
urlSite.setBorder(BorderFactory.createLineBorder(Color.black));
panelSite.setLayout(borderLayout3);
bAccess.setBackground(Color.white);
bAccess.setText("GO");
menuBar.setToolTipText("");
mFile.setText("文件");
mOpen.setText("打开");
mSave.setText("保存");
mSaveAs.setText("另存为");
mExit.setText("退出");
mFunction.setText("选项");
mBack.setText("退后");
mPrevious.setText("前进");
mFavorites.setText("收藏夹");
mFind.setText("搜索");
mAddFavorites.setText("添加到收藏夹");
labStatus.setBackground(Color.white);
labStatus.setBorder(BorderFactory.createLineBorder(Color.black));
labStatus.setToolTipText("");
labStatus.setText("显示信息");
mRefresh.setText("刷新");
//设置各菜单项的快截键
mOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
ActionEvent.CTRL_MASK));
mSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
ActionEvent.CTRL_MASK));
mSaveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F12,
ActionEvent.CTRL_MASK));
mExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,
ActionEvent.CTRL_MASK));
mBack.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
ActionEvent.CTRL_MASK));
mPrevious.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,
ActionEvent.CTRL_MASK));
mFind.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,
ActionEvent.CTRL_MASK));
mRefresh.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,
ActionEvent.CTRL_MASK));
mAddFavorites.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,
ActionEvent.CTRL_MASK));
panelSite.add(urlSite, BorderLayout.CENTER);
panelSite.add(bAccess, BorderLayout.EAST);
contentPane.add(panelAll, BorderLayout.CENTER);
panelAll.add(scroll, BorderLayout.CENTER);
panelAll.add(labStatus, BorderLayout.SOUTH);
contentPane.add(panelSite, BorderLayout.NORTH);
menuBar.add(mFile);
menuBar.add(mFunction);
menuBar.add(mFavorites);
mFile.add(mOpen);
mFile.add(mSave);
mFile.add(mSaveAs);
mFile.addSeparator();
mFile.add(mExit);
mFunction.add(mRefresh);
mFunction.add(mBack);
mFunction.add(mPrevious);
mFunction.add(mFind);
mFavorites.add(mAddFavorites);
initMenuItem();
this.bAccess.addActionListener(this);
this.mOpen.addActionListener(this);
this.mSave.addActionListener(this);
this.mSaveAs.addActionListener(this);
this.mExit.addActionListener(this);
this.mBack.addActionListener(this);
this.mPrevious.addActionListener(this);
this.mRefresh.addActionListener(this);
this.mAddFavorites.addActionListener(this);
this.mFind.addActionListener(this);
this.bAccess.addKeyListener(this);
this.urlSite.addKeyListener(this);
this.setSize(800, 600);
this.setLocation(0, 0);
this.setVisible(true);
}
/**
* 布局菜单项
*
* 在添加页面到收藏夹后,重新刷新显示菜单项
*
*/
private void initMenuItem()
{
addFavoritesItem();//添加收藏夹内容
this.menuBar.add(mFile);
this.menuBar.add(mFunction);
this.menuBar.add(mFavorites);
this.setJMenuBar(menuBar);
}
public static void main(String[] args)
{
new WebClientUI();
}
/**
* 访问internet的线程
* 为该类的内部类
* 每访问一次页面均构造该类
*/
class AccessInternet extends Thread
{
private String url;
AccessInternet(String url)
{
this.url=url;
}
public void run()
{
flag=1;//将标志设置为:1 表示访问web页面
try
{
URL urlURL=new URL(url);
urlSite.setText(url);
taContent.setContentType("text/html");
EditorKit ek = taContent.getEditorKitForContentType("text/html");
HTMLDocument doc = (HTMLDocument) ek.createDefaultDocument( );
taContent.read(urlURL.openStream(),doc);
accseTime++; //统计计数加1
} catch (MalformedURLException e)
{
error("您输入的URL地址所含的协议有误:"+url);
labStatus.setText("浏览页面" + urlSite.getText() + "失败");
}
catch (UnknownHostException e)
{
error("您输入的URL地址有误,无法找到URL地址所指示的主机:"+url);
labStatus.setText("浏览页面" + urlSite.getText() + "失败");
}
catch (ConnectException e)
{
error("无法连接服务器:"+url);
labStatus.setText("浏览页面" + urlSite.getText() + "失败");
}
catch (IOException e)
{
error("连接服务器发生IO错误:"+url);
labStatus.setText("浏览页面" + urlSite.getText() + "失败");
}
catch (NullPointerException e)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -