Eclipse插件开发之实例解析.docx
《Eclipse插件开发之实例解析.docx》由会员分享,可在线阅读,更多相关《Eclipse插件开发之实例解析.docx(24页珍藏版)》请在冰豆网上搜索。
![Eclipse插件开发之实例解析.docx](https://file1.bdocx.com/fileroot1/2022-12/30/4dff5882-f8a2-4bf7-b3e3-ec632d4de341/4dff5882-f8a2-4bf7-b3e3-ec632d4de3411.gif)
Eclipse插件开发之实例解析
Eclipse插件开发之实例解析篇
2005.04.05
1.Eclipse简介和插件开发
Eclipse是一个很让人着迷的开发环境,它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。
目前有着相当丰富且全面的开发工具方面的插件,但是Eclipse已经超越了开发环境的概念,可以想象Eclipse将成为未来的集成的桌面环境。
目前的Eclipse本身就具备资源管理和外部程序的功能,加上无所不能的插件,将构成一个丰富多彩的工作环境而不仅仅是一个IDE。
对于程序员来说,没有什么比可以随心所欲的定制工作环境更重要了,你的决心,勇气和创造力在与别人分享成果的过程中一览无余。
好了,你是不是心动了,如果你已经对Eclipse有一定的认识,那么,和我一起打造自己的个性化工作环境吧,首先我们一起开发一个天气预报的插件,然后我们打造属于自己的邮件快速监控功能。
以下的工作基于一定的前提,那就是你是一名Java程序员,你很欣赏并正开始使用Eclipse这个超酷的工作环境,别忘了下载最新版的Eclipse3.0,本文基于Eclipse3.0开发。
2.天气预报插件
如果你已经厌倦了总是要登录某些网站从相关网页上获取信息,这里有一个让你通过Eclipse快速获取信息的新方法。
让我们从头开始,做一个属于自己的天气预报插件吧,你的Eclipse将具有天气预报功能,是不是很酷呢?
在这一部分,我们将要实现一个Eclipse插件,他可以在任何我们想知道的时候通过简单的点击鼠标告诉我们本地区的天气预报,这当然很刺激。
对于一个程序员而言,事情就应该如此。
让我们开始吧,我们首先要定义一个插件,把他加到菜单和工具栏中。
对于没有插件开发经验的你,可以参考教您如何创建、调试和安装Eclipse插件树立基本的插件开发意识,当然,本文将详细的辅助你完成这一创造性的工作。
2.1最基础的插件
你可以完全参考教您如何创建、调试和安装Eclipse插件的插件示例,制作你的第一个helloEclipse插件,幸运的是,Eclipse3.0完全考虑到你的需求,通过菜单File->New->Other->Plug-inProject,输入项目名称,next出现对话框,只要在插件名处输入"muplugin",next以后选择"Hello,World"的插件模板你可以直接新建一个名为myplugin的最简单的插件,但其实我们的天气预报并不比它复杂多少,建完改插件以后的效果如下图。
现在,将项目作为运行时工作台运行(run-runasruntimeworkbench),在一个全新的Eclipse窗口中,通过点击菜单samplemenu的sampleAction或者工具栏中的圆形Eclipse图标,你将看到如下效果的对话框。
到此为止,天气预报插件的原始版做成了,通过修改plugin.xml,我们将菜单改成中文形式,需要修改的地方就2处。
label="SampleActionSet"
visible="true"
id="myplugin.actionSet">
label="天气预报"
icon="icons/sample.gif"
class="myplugin.actions.SampleAction"
tooltip="Hello,Eclipseworld"
menubarPath="sampleMenu/sampleGroup"
toolbarPath="sampleGroup"
id="myplugin.actions.SampleAction">
此时在运行时工作台,我们的菜单已经改变。
2.2用VisualEditer制作天气预报对话框
虽然菜单是天气预报,但是我们需要的不是helloEclispe对话框,我们需要的是告诉我们天气的对话框,当然需要我们从头开始,于是我们需要重新构建一个对话框,这个就需要VisualEditor来帮助进行界面的开发。
我们将使用VisualEditor实现一个Swing对话框,当然只用VE做一个对话框是有点大材小用,但是作为起点,已经合适了。
选择对话框的超类为javax.swing.JDiaog,点击Finish按钮。
等待一段时间后,我们的对话框就基本生成了,鼠标点击左上角图标,直接输入天气预报就是对话框的标题,同时我们可以看到左侧的VisualEditor面板。
然后我们将该对话框于与刚才的天气预报菜单连接找到SampleAction的run函数,如下所示:
publicvoidrun(IActionaction){
MessageDialog.openInformation(
window.getShell(),
"MypluginPlug-in",
"Hello,Eclipseworld");
}
替换成如下代码
publicvoidrun(IActionaction)
{
WeatherDialogwd=newWeatherDialog();
wd.setSize(400,335);
wd.show();
}
此时,点击菜单运行,我们的对话框看起来象这个样子,在此基础上我们还要在上面增加天气预报信息
2.3增加天气预报功能
下面的部分是重点,我们将使用具有解析Html功能的Swing组件JEditPane,来获取网络上的现成的天气预报信息,根据上图,从VisualEditor的面板中SwingComponents组点击JEditPane,加入到对话框中。
并修改对话框代码使得最终的代码如下:
/*
*Createdon2004-9-23
**/
packagemyplugin;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
import.URL;
importjavax.swing.JDialog;
importjavax.swing.JEditorPane;
/**
*
Title:
WatherDialog
*
Description:
这个是对话框类,
用于显示指定城市的当天的天气预报
*
Copyright:
Copyright(c)2004
*
Company:
UFSOFT
*@author赵勇
*@version1.0
*/
publicclassWatherDialogextendsJDialog
{
Stringcity="北京";
privateJEditorPanejEditorPane=null;
/**
*Thismethodinitializes
*/
publicWatherDialog(Stringcity)
{
super();
this.city=city;
initialize();
}
/**
*Thismethodinitializesthis
*@returnvoid
*/
privatevoidinitialize()
{
this.setContentPane(getJEditorPane());
try
{
//构建URL对象
URLurl
=newURL("
//cgi-bin/figureWeather/simpleSearch.cgi?
city="+city);
Stringtemp="";
BufferedReaderin
=newBufferedReader(newInputStreamReader(url.openStream()));
//使用openStream得到一输入流
并由此构造一个BufferedReader对象
StringinputLine;
//从输入流不断的读数据,
直到读完为止
while((inputLine=in.readLine())
!
=null)
temp=temp+inputLine+"\n";
//关闭输入流
in.close();
Stringweather
=temp.substring
(
temp.indexOf("
temp.lastIndexOf("body>")+5);
this.jEditorPane.setText(weather);
}
catch(Exceptione)
{
e.printStackTrace();
}
this.setTitle("天气预报");
this.setSize(400,166);
}
/**
*ThismethodinitializesjEditorPane
*
*@returnjavax.swing.JEditorPane
*/
privateJEditorPanegetJEditorPane()
{
if(jEditorPane==null)
{
jEditorPane=newJEditorPane();
jEditorPane.setContentType("text/html");
}
returnjEditorPane;
}
}
//@jve:
decl-index=0:
visual-constraint="70,19"
以上代码中最关键的部分就是对话框中的JEditorPane对象,在初始化时,从一个URL获取天气预报信息,表现为Html标记片段,不用解析,直接调用JEditorPane的setText方法,就可以将Html格式的信息直接按解析过的方式显示,也就是天气预报信息了,此时Action中的调用需要做修改
publicvoidrun(IActionaction)
{
WeatherDialogwd=newWeatherDialog("北京");
wd.setSize(400,335);
wd.show();
}
现在以运行时工作台的方式运行,点击天气预报菜单,可以看到下图:
如果你在上海或者其他城市,试着修改city参数为"上海",再次运行,你将发现,你仍然能够得到该城市的天气预报。
值得注意的是,Xmethod网站提供了一个天气预报的WebService,可惜只有美国的城市,不然我们可以使用WebService调用获取天气预报,将会更酷。
现在运行是工作台已经具备了天气预报的功能,还需要更进一步,将改插件导出发布,拷贝到Eclipse根目录的plugins目录中,重新启动(具体参见Eclipse帮助)。
现在你自己的Eclipse,就具备了天气预报的功能,只要你点击鼠标,就可以在编程之余轻松的获取天气信息。
除非你的老板认为你在工作时间随时了解天气情况不是一个好主意,我认为你完全可以将这个插件纳入个人收藏的插件之列。
你也可以在此基础上扩展,增加一些配置文件和属性设置,定制出满足自己要求的插件。
如果能够增加信息的自动过滤和筛选,那将是一次很愉快的体验,如果你有时间和兴趣,不妨一试。
3.邮件快速监控插件
现在你的工作因为Eclipse而更加惬意,更具创造力,那么你还有什么不满?
你是否厌倦了各种邮件客户端随时随地的骚扰你呢?
你希望你在高兴的时候适时的了解一下邮件的概况?
好了,既然想到了为什么犹豫呢,因为你是程序员,你就是要用Eclipse享受完全DIY的乐趣。
3.1生成插件
本部分我们将在以上myplugin插件的基础上增加一个邮件过滤显示的对话框,类似的我们通过VisualEditer创建一个名为MailDialog的对话框,并增加一个JEditPane用来显示邮箱中我们关注的信息。
修改plugin.xml,增加一个"我的邮件"菜单
label="邮件信息"
icon="icons/sample.gif"
class="myplugin.actions.MailAction"
tooltip="邮件信息"
menubarPath="sampleMenu/sampleGroup"
toolbarPath="sampleGroup"
id="myplugin.actions.MailAction">
现在,你知道要创建一个MailAction的Action类,并在在Run中增加如下代码
MailConfigmail=newMailConfig();
StringpopServer="server";
StringpopUser="zhaoyong";
StringpopPassword="1234";
//设置需要过滤的关键字:
发件人和邮件主题
String[]strFrom=newString[]{"zhaoyong"};
String[]strSubject=newString[]{"测试"};
MailConfig[]mc=newMailConfig[]{mail};
MailDialogmd=newMailDialog(mc);
System.err.println("runrunrun");
md.setSize(400,335);
md.show();
以上的代码编译不会通过,但是别着急,慢慢来,很快了。
3.2构建邮件监控对话框
当然你需要建立一个MailConfig类用来表示一个邮箱的具体设置已及相关信息,这里就不在累述说明,详情参见参考资料中的代码。
需要说明的式MailConfig除了要记录一个邮箱的地址,用户名和密码外,还提供2个关键字数组,如果为空,不加过滤,如果关键字有值,系统会根据发件人和邮件标题中是否包含关键字来进行显示邮件信息,已保证你的绝对自由。
首先我们需要实现一个MailConfig类,表示邮件配置,每个MailConfig的对象代表一个邮件帐户,我们的系统将能显示多个邮箱的配置,每个MailConfig中使用一个数组来保存需要过滤的收件人和邮件地址。
MailConfig类的中的变量如下:
StringpopServer;
StringpopUser;
StringpopPassword;
//设置需要过滤的关键字
:
发件人和邮件主题
String[]strFrom;
String[]strSubject;
//是否显示邮件内容
booleanisViewContent=false;
同样,我们将使用一个对话框来显示邮件信息,MailDialog需要引用javaMail.jar,和activation.jar这两个类包,确保已经有这两个类包并加入到项目的类路径中。
最后的MailDialog代码如下:
packagemyplugin;
importjava.io.IOException;
importjava.util.Properties;
importjavax.mail.Folder;
importjavax.mail.Message;
importjavax.mail.MessagingException;
importjavax.mail.Session;
importjavax.mail.Store;
importjavax.mail.internet.InternetAddress;
importjavax.swing.JDialog;
importjavax.swing.JEditorPane;
importjavax.swing.JTextPane;
/**
*@authorzhaoyong
*
*TODOTochangethe
templateforthis
generatedtypecommentgoto
*Window-Preferences-
Java-CodeStyle-CodeTemplates
*/
publicclassMailDialogextendsJDialog
{
privateJEditorPanejEditorPane=null;
privateJTextPanejTextPane=null;
//可以显示多个邮件配置
MailConfig[]mc=null;
/**
*Thismethodinitializes
*构造函数
*@parammc:
需要显示的多个邮箱配置对象。
*/
publicMailDialog(MailConfig[]mc)
{
super();
if(mc!
=null)
this.mc=mc;
else
System.err.println
(
"邮件配置错误!
");
initialize();
}
/**
*Thismethodinitializesthis
*初始化
*@returnvoid
*/
privatevoidinitialize()
{
try
{
//设定显示内容的面板
this.setContentPane
(getJTextPane());
//取得所有的新邮件信息
Strings=getAllMailInfo();
//将信息显示在对话框中
this.jTextPane.setText(s);
this.setTitle("邮件信息");
this.setSize(251,100);
}
catch(Exceptione)
{
//发生错误显示错误信息
this.jTextPane.setText
(e.toString());
e.printStackTrace();
}
}
/**取得所有的邮箱的需要监控的邮件信息
*
*@returnString
*/
privateStringgetAllMailInfo()
{
StringallMailInfo="";
if(mc.length<1)
allMailInfo="没有配置邮箱!
";
else
{
for(inti=0;i{
//循环获取每个邮箱的邮件信息
allMailInfo=allMailInfo+
getMailInfo(mc[i]);
}
}
//还没有收到相关的邮件
if(allMailInfo.trim().length()==0)
allMailInfo="未检测到相关新邮件!
";
returnallMailInfo;
}
/*
*得到一个邮箱中满足条件的
所有新邮件的字符串形式
**/
privateStringgetMailInfo(MailConfigmc)
{
//最终输出的邮件信息
StringmailInfo="";
//每个邮箱服务器上的Store和Folder对象
Storestore=null;
Folderfolder=null;
try
{
Propertiesprops=System.getProperties();
//与邮件服务器生成一个Session
Sessionsession=
Session.getDefaultInstance(props,null);
//给出服务器,用户名,密码连接服务器
store=session.getStore("pop3");
store.connect(mc.getPopServer(),mc.getPopUser(),mc.getPopPassword());
//取得默认的邮件Folder
folder=store.getDefaultFolder();
if(folder==null)
thrownewException
("Nodefaultfolder");
//取得收件箱
folder=folder.getFolder("INBOX");
if(folder==null)
thrownewException("NoPOP3INBOX");
//以只读方式打开收件箱
folder.open(Folder.READ_ONLY);
//获取所有新邮件并处理
Message[]msgs=folder.getMessages();
for(inti=0;i{
Messagemessage=msgs[i];
//取得每封邮件的信息,
需要引用MailConfig对象进行关键字过滤
mailInfo=mailInfo+
getMessageInfo(message,mc);
}
}
catch(Exceptionex)
{
ex.printStackTrace();
}
finally
{
//安全的关闭邮件服务器资源
try
{
if(folder!
=null)folder.close(true);
if(store!
=null)store.close();
}
catch(Exceptionex2)
{
ex2.printStackTrace();
}
}
returnmailInfo;
}
/**
*