Eclipse 简介和插件开发示例 (IBM的文章)

article/2025/6/23 12:19:41

Eclipse 是一个很让人着迷的开发环境,它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。目前网上流传相当丰富且全面的开发工具方面的插件,但是Eclipse已经超越了开发环境的概念,可以想象Eclipse将成为未来的集成的桌面环境。目前的Eclipse本身就具备资源管理和外部程序的功能,加上无所不能的插件,将构成一个丰富多彩的工作环境而不仅仅是一个IDE。
  
  
1.Eclipse简介和插件开发
  Eclipse 是一个很让人着迷的开发环境,它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。目前网上流传相当丰富且全面的开发工具方面的插件,但是Eclipse已经超越了开发环境的概念,可以想象Eclipse将成为未来的集成的桌面环境。目前的Eclipse本身就具备资源管理和外部程序的功能,加上无所不能的插件,将构成一个丰富多彩的工作环境而不仅仅是一个IDE。对于程序员来说,没有什么比可以随心所欲的定制的工作环境更重要,你的决心,勇气和创造力在与别人分享成果的过程中一览无余。好了,你是不是心动了,如果你已经对Eclipse有一定的认识,那么,和我一起打造自己的个性化工作环境吧,首先我们一起开发一个天气预报的插件,然后我们打造属于自己的邮件快速监控功能。
  
  以下的工作基于一定的前提,那就是你是一名Java程序员,你很欣赏并正开始使用Eclipse这个超酷的工作环境,别忘了下载最新版的Eclipse3.0,本文基于Eclipse3.0开发。
  
  
2.天气预报插件
  如果你已经厌倦了总是要登录某些网站从相关网页上获取信息,这里有一个让你通过Eclipse快速获取信息的新方法。让我们从头开始,做一个属于自己的天气预报插件吧,你的Eclipse将具有天气预报功能,是不是很酷呢?
  
  在这一部分,我们将要实现一个Eclipse插件,他可以在任何我们想知道的时候通过简单的点击鼠标告诉我们本地区的天气预报,这当然很刺激。对于一个程序员而言,事情就应该如此。让我们开始吧,我们首先要定义一个插件,把他加到菜单和工具栏中。对于没有插件开发经验的你,可以参考《开发 Eclipse 插件》,树立基本的插件开发意识,当然,本文将详细的辅助你完成这一创造性的工作。
  
  2.1最基础的插件
  
  打开菜单 File -> New-> Other ->Plug-in Project,输入项目名称,next出现对话框,只要在插件名处输入"muplugin",next 以后选择 "Hello,World"的插件模板你可以直接新建一个名为myplugin的最简单的插件,但其实我们的天气预报并不比它复杂多少,建完改插件以后的效果如下图。
  

 


  现在,将项目作为运行时工作台运行(run - run as runtime workbench),在一个全新的Eclipse窗口中,通过点击菜单 sample menu 的sample Action或者工具栏中的圆形Eclipse 图标,你将看到如下效果的对话框。
  

 


  到此为止,天气预报插件的原始版做成了,通过修改plugin.xml,我们将菜单改成中文形式,需要修改的地方就2处,详见表格。
  
  <actionSet label="Sample Action Set" visible="true" id="myplugin.actionSet">
  <menu label="我的空间" id="sampleMenu">
  <separator name="sampleGroup">
  </separator>
  </menu>
  <action label="天气预报" icon="icons/sample.gif" class="myplugin.actions.SampleAction"
  tooltip="Hello, Eclipse world" menubarPath="sampleMenu/sampleGroup"
  toolbarPath="sampleGroup" id="myplugin.actions.SampleAction">
  </action>
  
  此时在运行时工作台,我们的菜单已经改变。
  

 


  2.2用VisualEditer制作天气预报对话框
  
  虽然菜单是天气预报,但是我们需要的不是hello Eclispe对话框,我们需要的是告诉我们天气的对话框,当然需要我们从头开始,于是我们需要重新构建一个对话框,这个就需要 Visual Editor来帮助进行界面的开发。我们将使用Visual Editor实现一个Swing对话框,当然只用VE做一个对话框是有点大材小用,但是作为起点,已经合适了。
  
  首先构建Visual Editer开发环境(读者可参考相关资料),当一切准备齐全,鼠标右键点击PackgeExpoler中的 "muplugin.actions"java文件,从弹出式菜单中选择 new->other->VisualClass,新建一个可视化的类,弹出界面如下图:
  

 


  选择next,然后在name中输入WeatherDialog,这个就是我们用来显示天气预报的dialog
  
  选择该对话框的超类为javax.swing.JDiaog,点击Finish按钮。等待一段时间后,我们的对话框就基本生成了,鼠标点击左上角图标,直接输入天气预报就是对话框的标题,同时 我们可以看到左侧的VisualEditor面板。
  

 


  然后我们将该对话框于与刚才的天气预报菜单连接找到SampleAction的run函数,如下所示:
  
  public void run(IAction action) {
  MessageDialog.openInformation(
  window.getShell(),"Myplugin Plug-in", "Hello, Eclipse world");
  }
  
  替换成如下代码
  
  public void run(IAction action)
  {
  WeatherDialog wd=new WeatherDialog();
  wd.setSize(400, 335);
  wd.show();
  }
  
  此时,点击菜单运行,我们的对话框看起来象这个样子,在此基础上我们还要在上面增加天气预报信息。
  

 


  2.3增加天气预报功能
  

 


  下面的部分是重点,我们将使用具有解析Html功能的Swing组件JEditPane,来获取网络上的现成的天气预报信息,根据上图,从 VisualEditor的面板中Swing Components组点击JEditPane,加入到对话框中。并修改对话框代码使得最终的代码如下:
  
  /*
  * Created on 2004-9-23
  * */
  package myplugin;
  
  
  import java.io.BufferedReader;
  import java.io.InputStreamReader;
  import java.net.URL;
  
  import javax.swing.JDialog;
  import javax.swing.JEditorPane;
  
  /**
  * <p>Title: WatherDialog</p>
  * <p>Description: 这个是对话框类,用于显示指定城市的当天的天气预报</p>
  * <p>Copyright: Copyright (c) 2004</p>
  * <p>Company:UF SOFT</p>
  * @author 赵勇
  * @version 1.0
  */
  public class WatherDialog extends JDialog
  {
  String city="北京";
  
  private JEditorPane jEditorPane = null;
  /**
  * This method initializes
  * /
  public WatherDialog(String city)
  {
  super();
  this.city=city;
  initialize();
  }
  /**
  * This method initializes this
  * @return void
  */
  private void initialize()
  {
  this.setContentPane(getJEditorPane());
  try
  {
  //构建URL对象
  URL url =new URL("http://weather.news.sina.com.cn//cgi-bin/figureWeather/simpleSearch.cgi?city="+city);
  String temp="";
  BufferedReader in
  = new BufferedReader(new InputStreamReader(url.openStream()));
  //使用openStream得到一输入流并由此构造一个BufferedReader对象
  String inputLine;
  //从输入流不断的读数据,直到读完为止
  while ((inputLine = in.readLine()) != null)
  temp=temp+inputLine+"/n";
  //关闭输入流
  in.close();
  String weather
  =temp.substring ( temp.indexOf( "<body"),
  temp.lastIndexOf( "body>")+5);
  
  this.jEditorPane .setText(weather);
  }
  catch (Exception e)
  {
  e.printStackTrace();
  }
  this.setTitle("天气预报");
  this.setSize(400, 166);
  
  }
  /**
  * This method initializes jEditorPane
  *
  * @return javax.swing.JEditorPane
  */
  private JEditorPane getJEditorPane()
  {
  if (jEditorPane == null)
  {
  jEditorPane = new JEditorPane();
  jEditorPane.setContentType( "text/html");
  }
  return jEditorPane;
  }
  } // @jve:decl-index=0:visual-constraint="70,19"
  
  以上代码中最关键的部分就是对话框中的JEditorPane对象,在初始化时,从一个URL 获取天气预报信息,表现为Html标记片段,不用解析,直接调用JEditorPane的setText 方法,就可以将Html格式的信息直接按解析过的方式显示,也就是天气预报信息了,
  
  此时Action中的调用需要做修改
  
  public void run(IAction action)
  {
  WeatherDialog wd=new WeatherDialog("北京");
  wd.setSize(400, 335);
  wd.show();
  }
  
  现在以运行时工作台的方式运行,点击天气预报菜单,可以看到下图:
  


  如果你在上海或者其他城市,试着修改city参数为"上海",再次运行,你将发现,你仍然能够得到该城市的天气预报(这里我们从网站上提取的信息,有点投机取巧了)。值得注意的是,Xmethod网站提供了一个天气预报的WebService,可惜只有美国的城市,不然我们可以使用Web Service调用获取天气预报,将会更酷。
  
  现在运行是工作台已经具备了天气预报的功能,还需要更进一步,将改插件导出发布,拷贝到Eclipse根目录的plugins目录中,重新启动(具体参见Eclipse帮助)。现在你自己的Eclipse,就具备了天气预报的功能,只要你点击鼠标,就可以在编程之余轻松的获取天气信息。 除非你的老板认为你在工作时间随时了解天气情况不是一个好主意,我认为你完全可以将这个插件纳入个人收藏的插件之列。你也可以在此基础上扩展,增加一些配置文件和属性设置,定制出满足自己要求的插件。如果能够增加信息的自动过滤和筛选,那将是一次很愉快的体验,如果你有时间和兴趣,不妨一试。
  
  3.邮件快速监控插件
  现在你的工作因为Eclipse而更加惬意,更具创造力,那么你还有什么不满?你是否厌倦了各种邮件客户端随时随地的骚扰你呢?你希望你在高兴的时候适时的了解一下邮件的概况?好了,既然想到了为什么犹豫呢,因为你是程序员,你就是要用Eclipse享受完全DIY的乐趣。
  
  3.1生成插件
  
  本部分我们将在以上myplugin插件的基础上增加一个邮件过滤显示的对话框,类似的我们通过VisualEditer创建一个名为MailDialog的对话框,并增加一个JEditPane用来显示邮箱中我们关注的信息。
  
  修改plugin.xml,增加一个"我的邮件"菜单
  
  <action
  label="邮件信息"
  icon="icons/sample.gif"
  class="myplugin.actions.MailAction"
  tooltip="邮件信息"
  menubarPath="sampleMenu/sampleGroup"
  toolbarPath="sampleGroup"
  id="myplugin.actions.MailAction">
  </action>
  
  现在,你知道要创建一个MailAction的Action类,并在在Run中增加如下代码
  
  MailConfig mail=new MailConfig();
  
  String popServer="server";
  String popUser="zhaoyong";
  String popPassword="1234";
  
  //设置需要过滤的关键字:发件人和邮件主题
  String [] strFrom=new String[] {"zhaoyong"};
  String [] strSubject=new String[] {"测试"};
  
  MailConfig[] mc =new MailConfig [] { mail };
  MailDialog md=new MailDialog(mc);
  System.err.println("run run run ") ;
  md.setSize(400, 335);
  md.show();
  
  以上的代码编译不会通过,但是别着急,慢慢来,很快了。
  
  3.2构建邮件监控对话框
  
  当然你需要建立一个MailConfig类用来表示一个邮箱的具体设置已及相关信息,这里就不在累述说明,详情参见参考资料中的代码。需要说明的式MailConfig除了要记录一个邮箱的地址,用户名和密码外,还提供2个关键字数组,如果为空,不加过滤,如果关键字有值,系统会根据发件人和邮件标题中是否包含关键字来进行显示邮件信息,已保证你的绝对自由。
  
  首先我们需要实现一个MailConfig类,表示邮件配置,每个MailConfig的对象代表一个邮件帐户,我们的系统将能显示多个邮箱的配置,每个MailConfig中使用一个数组来保存需要过滤的收件人和邮件地址。
  
  MailConfig类的中的变量如下:
  
  String popServer;
  String popUser;
  String popPassword;
  
  //设置需要过滤的关键字:发件人和邮件主题
  
  String [] strFrom;
  String [] strSubject;
  
  //是否显示邮件内容
  boolean isViewContent=false;
  
  同样,我们将使用一个对话框来显示邮件信息,MailDialog需要引用javaMail.jar,和activation.jar这两个类包,确保已经有这两个类包并加入到项目的类路径中。最后的MailDialog代码如下:
  
  package myplugin;
  
  
  import java.io.IOException;
  import java.util.Properties;
  
  import javax.mail.Folder;
  import javax.mail.Message;
  import javax.mail.MessagingException;
  import javax.mail.Session;
  import javax.mail.Store;
  import javax.mail.internet.InternetAddress;
  import javax.swing.JDialog;
  import javax.swing.JEditorPane;
  import javax.swing.JTextPane;
  /**
  * @author zhaoyong
  *
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
 ?/
  public class MailDialog extends JDialog
  {
  
  private JEditorPane jEditorPane = null;
  private JTextPane jTextPane = null;
  
  //可以显示多个邮件配置
  MailConfig[] mc= null;
  
  
  /**
  * This method initializes
  * 构造函数
  * @param mc : 需要显示的多个邮箱配置对象。
  */
  public MailDialog(MailConfig[] mc)
  {
  
  super();
  
  if(mc!=null)
  this.mc = mc;
  else
  System.err.println("邮件配置错误!") ;
  
  initialize();
  }
  /**
  * This method initializes this
  * 初始化
  * @return void
  */
  private void initialize()
  {
  try
  {
  //设定显示内容的面板
  this.setContentPane(getJTextPane());
  //取得所有的新邮件信息
  String s= getAllMailInfo();
  //将信息显示在对话框中
  this.jTextPane .setText(s);
  
  this.setTitle("邮件信息");
  this.setSize(251, 100);
  }
  catch (Exception e)
  {
  //发生错误显示错误信息
  this.jTextPane .setText(e.toString());
  e.printStackTrace();
  }
  
  }
  /**取得所有的邮箱的需要监控的邮件信息
  *
  * @return String
  */
  private String getAllMailInfo()
  {
  String allMailInfo="";
  
  if (mc.length <1)
  allMailInfo="没有配置邮箱!";
  else
  {
  for(int i=0;i<mc.length;i++)
  {
  //循环获取每个邮箱的邮件信息
  allMailInfo=allMailInfo+getMailInfo(mc[i]);
  }
  }
  //还没有收到相关的邮件
  if (allMailInfo.trim().length() ==0)
  allMailInfo="未检测到相关新邮件!";
  return allMailInfo;
  
  }
  /*
  *得到一个邮箱中满足条件的所有新邮件的字符串形式
  **/
  private String getMailInfo(MailConfig mc)
  {
  //最终输出的邮件信息
  String mailInfo="";
  
  //每个邮箱服务器上的Store和Folder对象
  Store store=null;
  Folder folder=null;
  
  try
  {
  
  Properties props = System.getProperties();
  //与邮件服务器生成一个Session
  Session session = Session.getDefaultInstance( props,null);
  
  //给出服务器,用户名,密码连接服务器
  store = session.getStore("pop3");
  store.connect(mc.getPopServer(), mc.getPopUser(),mc.getPopPassword());
  
  //取得默认的邮件Folder
  folder = store.getDefaultFolder();
  if (folder == null)
  throw new Exception("No default folder");
  
  //取得收件箱
  folder = folder.getFolder("INBOX");
  if (folder == null)
  throw new Exception("No POP3 INBOX");
  
  //以只读方式打开收件箱
  folder.open(Folder.READ_ONLY);
  
  //获取所有新邮件并处理
  Message[] msgs = folder.getMessages();
  
  for (int i = 0; i < msgs.length; i++)
  {
  Message message= msgs[i];
  //取得每封邮件的信息,需要引用MailConfig对象进行关键字过滤
  mailInfo = mailInfo+ getMessageInfo( message,mc);
  }
  
  }
  catch (Exception ex)
  {
  ex.printStackTrace();
  }
  finally
  {
  //安全的关闭邮件服务器资源
  try
  {
  if (folder!=null) folder.close(true);
  if (store!=null) store.close();
  }
  catch (Exception ex2) {ex2.printStackTrace();}
  }
  return mailInfo;
  }
  
  /**
  * 得到一封邮件的信息,需要根据MailConfig过滤
  * @param mailInfo
  * @param message
  * @return 邮件信息
  * @throws MessagingException
  * @throws IOException
  */
  private String getMessageInfo( final Message message ,final MailConfig mc)
  throws MessagingException, IOException
  {
  //返回的改邮件信息
  String mailInfo="";
  
  String from=((InternetAddress)message.getFrom()[0]).getPersonal();
  
  if (from==null)
  from=((InternetAddress)message.getFrom()[0]).getAddress();
  
  String subject=message.getSubject();
  
  //如果满足过滤信息则显示,否则返回空
  if(isElementinString(from,mc.getStrFrom())
  ||isElementinString(subject,mc.getStrSubject()) )
  {
  mailInfo=mailInfo+"发件人 : "+from+"/n";
  mailInfo=mailInfo+"邮件主题 : "+subject+"/n";
  mailInfo=mailInfo+"发送时间 : "+message.getSentDate() +"/n";
  
  //如果显示内容,则打印内容
  if(mc.isViewContent)
  mailInfo=mailInfo+message.getContent() +"/n";
  
  mailInfo=mailInfo+"------------------------------------/n";
  }
  return mailInfo;
  }
  
  private JTextPane getJTextPane()
  {
  if (jTextPane == null)
  {
  jTextPane = new JTextPane();
  }
  
  return jTextPane;
  }
  
  /**
  * 判断目标关键字数组中是否有指定的字符串,进行过滤
  * @param targetStr :
  * @param keys :
  * @return 如果有,返回true, 否则返回false
  */
  
  private boolean isElementinString(String targetStr,String [] keys)
  {
  //没指定过滤条件,显示所有
  if (keys==null)
  return true;
  //指定字符串为空,直接返回false
  if (targetStr==null)
  return false;
  for(int i=0;i<keys.length ;i++)
  {
  if (targetStr.indexOf(keys[i])>-1)
  return true;
  }
  return false;
  }
  
  }
  // @jve:decl-index=0:visual-constraint="10,10"--说明,这是Visual Editor添加的控制信息
  
  以上代码的注释已经保证你能够看清楚,这里就不加累述,有兴趣的可以自己试试,体验一切尽在掌握的快感。当然这个例子做的实在简单,因此也为你的进一步开发留有足够的余地。
  
  3.3 打包和发布
  
  到此,在mypulgin中增加了邮件信息菜单和对话框,系统的plugin.xml如下:
  
  <?xml version="1.0" encoding="UTF-8"?>
  <?eclipse version="3.0"?>
  <plugin
  id="myplugin"
  name="Myplugin Plug-in"
  version="1.0.0"
  provider-name=""
  class="myplugin.MypluginPlugin">
  
  <runtime>
  <library name="myplugin.jar">
  <export name="*"/>
  </library>
  <library name="lib/javaMail.jar">
  <export name="*"/>
  </library>
  <library name="lib/activation.jar">
  <export name="*"/>
  </library>
  </runtime>
  
  <requires>
  <import plugin="org.eclipse.ui"/>
  <import plugin="org.eclipse.core.runtime"/>
  </requires>
  
  <extension
  point="org.eclipse.ui.actionSets">
  <actionSet
  label="Sample Action Set"
  visible="true"
  id="myplugin.actionSet">
  <menu
  label="我的空间"
  id="sampleMenu">
  <separator
  name="sampleGroup">
  </separator>
  </menu>
  <action
  label="天气预报"
  icon="icons/sample.gif"
  class="myplugin.actions.SampleAction"
  tooltip="Hello, Eclipse world"
  menubarPath="sampleMenu/sampleGroup"
  toolbarPath="sampleGroup"
  id="myplugin.actions.SampleAction">
  </action>
  <action
  label="邮件信息"
  icon="icons/sample.gif"
  class="myplugin.actions.MailAction"
  tooltip="邮件信息"
  menubarPath="sampleMenu/sampleGroup"
  toolbarPath="sampleGroup"
  id="myplugin.actions.MailAction">
  </action>
  </actionSet>
  </extension>
  </plugin>
  
  实际上,我们在一个插件中加入了2个功能,因此就实现了我们的开发环境的自我扩展和定制。同样,参考Eclipse的帮助,你可以轻松的再次将插件打包导出,并将其加入自己的Eclipse 的plugins目录(可能需要解压缩),或通过help菜单的Update选项进行安装,注意导出时需要选定相关的类包。重新启动,你将发现自己的IDE已经多了自己的菜单,开发环境已经随着自己的意愿在改变了,程序员天生的满足感油然而生。
  
  现在,你可以在需要的时候点击菜单,了解你希望监控的邮件情况或者最近的天气情况,一切轻松的尽在掌握,Eclipse的插件,就是这样全能。
  
  4.总结
  那么,聪明的你有没有发现什么问题,对,上面的东西太粗糙,太简单了,你可以做进一步的优化设计和功能加强,比如,自己增加邮件配置文件而不是写在代码里面,动态监控弹出邮件预警(通过事先设定的紧急状态),你也许还会想起来很多的新的主意,比如我为什么不能有个能看电影的插件?或是Eclipse中飘出动听的音乐?别急,这些不一定需要你亲手去做,http://sourceforge.net/projects/rocexwang/ 有一个播放器插件,但是现在仅能播放音乐,国外已经有人用Eclipse开发游戏,也有人用Eclipse来做MIS系统的。http://www.matrix.org.cn/forum_view.asp?forum_id=25&view_id=10510 有一个国人开发的俄罗斯方块游戏,虽然简单了一点。当然,通过网址http://eclipse-plugins.2y.net/eclipse/index.jsp和http://www.eclipseplugincentral.com/你可以找到很多的插件,如果你知道什么更好的插件,请告诉我。
  
  Eclipse提供了一个纯的框架和插件结构,使得开发任何功能的插件都能成为现实。本文介绍了2个有趣的Eclipse插件的开发,可以使我们的工作环境增加了两个可爱的小功能,同时也使得你具备了基础的插件开发能力,借助Eclipse的强大功能,从此你可以把你的任何想法变为现实。同时请保持与别人的交流,我会很乐意了解你的新奇的插件,并收藏和学习任何好的插件,打造一个完全属于自己的个性化的开发环境。Eclipse将在不久的将来成为一个全能的Platform,这一点在全世界数以万计的开发人员的手中,正一点一点变为现实。

 


  现在,将项目作为运行时工作台运行(run - run as runtime workbench),在一个全新的Eclipse窗口中,通过点击菜单 sample menu 的sample Action或者工具栏中的圆形Eclipse 图标,你将看到如下效果的对话框。
  


  到此为止,天气预报插件的原始版做成了,通过修改plugin.xml,我们将菜单改成中文形式,需要修改的地方就2处,详见表格。
  
  <actionSet label="Sample Action Set" visible="true" id="myplugin.actionSet">
  <menu label="我的空间" id="sampleMenu">
  <separator name="sampleGroup">
  </separator>
  </menu>
  <action label="天气预报" icon="icons/sample.gif" class="myplugin.actions.SampleAction"
  tooltip="Hello, Eclipse world" menubarPath="sampleMenu/sampleGroup"
  toolbarPath="sampleGroup" id="myplugin.actions.SampleAction">
  </action>
  
  此时在运行时工作台,我们的菜单已经改变。
  


  2.2用VisualEditer制作天气预报对话框
  
  虽然菜单是天气预报,但是我们需要的不是hello Eclispe对话框,我们需要的是告诉我们天气的对话框,当然需要我们从头开始,于是我们需要重新构建一个对话框,这个就需要 Visual Editor来帮助进行界面的开发。我们将使用Visual Editor实现一个Swing对话框,当然只用VE做一个对话框是有点大材小用,但是作为起点,已经合适了。
  
  首先构建Visual Editer开发环境(读者可参考相关资料),当一切准备齐全,鼠标右键点击PackgeExpoler中的 "muplugin.actions"java文件,从弹出式菜单中选择 new->other->VisualClass,新建一个可视化的类,弹出界面如下图:
  


  选择next,然后在name中输入WeatherDialog,这个就是我们用来显示天气预报的dialog
  
  选择该对话框的超类为javax.swing.JDiaog,点击Finish按钮。等待一段时间后,我们的对话框就基本生成了,鼠标点击左上角图标,直接输入天气预报就是对话框的标题,同时 我们可以看到左侧的VisualEditor面板。
  


  然后我们将该对话框于与刚才的天气预报菜单连接找到SampleAction的run函数,如下所示:
  
  public void run(IAction action) {
  MessageDialog.openInformation(
  window.getShell(),"Myplugin Plug-in", "Hello, Eclipse world");
  }
  
  替换成如下代码
  
  public void run(IAction action)
  {
  WeatherDialog wd=new WeatherDialog();
  wd.setSize(400, 335);
  wd.show();
  }
  
  此时,点击菜单运行,我们的对话框看起来象这个样子,在此基础上我们还要在上面增加天气预报信息。
  


  2.3增加天气预报功能
  


  下面的部分是重点,我们将使用具有解析Html功能的Swing组件JEditPane,来获取网络上的现成的天气预报信息,根据上图,从 VisualEditor的面板中Swing Components组点击JEditPane,加入到对话框中。并修改对话框代码使得最终的代码如下:
  
  /*
  * Created on 2004-9-23
  * */
  package myplugin;
  
  
  import java.io.BufferedReader;
  import java.io.InputStreamReader;
  import java.net.URL;
  
  import javax.swing.JDialog;
  import javax.swing.JEditorPane;
  
  /**
  * <p>Title: WatherDialog</p>
  * <p>Description: 这个是对话框类,用于显示指定城市的当天的天气预报</p>
  * <p>Copyright: Copyright (c) 2004</p>
  * <p>Company:UF SOFT</p>
  * @author 赵勇
  * @version 1.0
  */
  public class WatherDialog extends JDialog
  {
  String city="北京";
  
  private JEditorPane jEditorPane = null;
  /**
  * This method initializes
  * /
  public WatherDialog(String city)
  {
  super();
  this.city=city;
  initialize();
  }
  /**
  * This method initializes this
  * @return void
  */
  private void initialize()
  {
  this.setContentPane(getJEditorPane());
  try
  {
  //构建URL对象
  URL url =new URL("http://weather.news.sina.com.cn//cgi-bin/figureWeather/simpleSearch.cgi?city="+city);
  String temp="";
  BufferedReader in
  = new BufferedReader(new InputStreamReader(url.openStream()));
  //使用openStream得到一输入流并由此构造一个BufferedReader对象
  String inputLine;
  //从输入流不断的读数据,直到读完为止
  while ((inputLine = in.readLine()) != null)
  temp=temp+inputLine+"/n";
  //关闭输入流
  in.close();
  String weather
  =temp.substring ( temp.indexOf( "<body"),
  temp.lastIndexOf( "body>")+5);
  
  this.jEditorPane .setText(weather);
  }
  catch (Exception e)
  {
  e.printStackTrace();
  }
  this.setTitle("天气预报");
  this.setSize(400, 166);
  
  }
  /**
  * This method initializes jEditorPane
  *
  * @return javax.swing.JEditorPane
  */
  private JEditorPane getJEditorPane()
  {
  if (jEditorPane == null)
  {
  jEditorPane = new JEditorPane();
  jEditorPane.setContentType( "text/html");
  }
  return jEditorPane;
  }
  } // @jve:decl-index=0:visual-constraint="70,19"
  
  以上代码中最关键的部分就是对话框中的JEditorPane对象,在初始化时,从一个URL 获取天气预报信息,表现为Html标记片段,不用解析,直接调用JEditorPane的setText 方法,就可以将Html格式的信息直接按解析过的方式显示,也就是天气预报信息了,
  
  此时Action中的调用需要做修改
  
  public void run(IAction action)
  {
  WeatherDialog wd=new WeatherDialog("北京");
  wd.setSize(400, 335);
  wd.show();
  }
  
  现在以运行时工作台的方式运行,点击天气预报菜单,可以看到下图:
  


  如果你在上海或者其他城市,试着修改city参数为"上海",再次运行,你将发现,你仍然能够得到该城市的天气预报(这里我们从网站上提取的信息,有点投机取巧了)。值得注意的是,Xmethod网站提供了一个天气预报的WebService,可惜只有美国的城市,不然我们可以使用Web Service调用获取天气预报,将会更酷。
  
  现在运行是工作台已经具备了天气预报的功能,还需要更进一步,将改插件导出发布,拷贝到Eclipse根目录的plugins目录中,重新启动(具体参见Eclipse帮助)。现在你自己的Eclipse,就具备了天气预报的功能,只要你点击鼠标,就可以在编程之余轻松的获取天气信息。 除非你的老板认为你在工作时间随时了解天气情况不是一个好主意,我认为你完全可以将这个插件纳入个人收藏的插件之列。你也可以在此基础上扩展,增加一些配置文件和属性设置,定制出满足自己要求的插件。如果能够增加信息的自动过滤和筛选,那将是一次很愉快的体验,如果你有时间和兴趣,不妨一试。
  
  3.邮件快速监控插件
  现在你的工作因为Eclipse而更加惬意,更具创造力,那么你还有什么不满?你是否厌倦了各种邮件客户端随时随地的骚扰你呢?你希望你在高兴的时候适时的了解一下邮件的概况?好了,既然想到了为什么犹豫呢,因为你是程序员,你就是要用Eclipse享受完全DIY的乐趣。
  
  3.1生成插件
  
  本部分我们将在以上myplugin插件的基础上增加一个邮件过滤显示的对话框,类似的我们通过VisualEditer创建一个名为MailDialog的对话框,并增加一个JEditPane用来显示邮箱中我们关注的信息。
  
  修改plugin.xml,增加一个"我的邮件"菜单
  
  <action
  label="邮件信息"
  icon="icons/sample.gif"
  class="myplugin.actions.MailAction"
  tooltip="邮件信息"
  menubarPath="sampleMenu/sampleGroup"
  toolbarPath="sampleGroup"
  id="myplugin.actions.MailAction">
  </action>
  
  现在,你知道要创建一个MailAction的Action类,并在在Run中增加如下代码
  
  MailConfig mail=new MailConfig();
  
  String popServer="server";
  String popUser="zhaoyong";
  String popPassword="1234";
  
  //设置需要过滤的关键字:发件人和邮件主题
  String [] strFrom=new String[] {"zhaoyong"};
  String [] strSubject=new String[] {"测试"};
  
  MailConfig[] mc =new MailConfig [] { mail };
  MailDialog md=new MailDialog(mc);
  System.err.println("run run run ") ;
  md.setSize(400, 335);
  md.show();
  
  以上的代码编译不会通过,但是别着急,慢慢来,很快了。
  
  3.2构建邮件监控对话框
  
  当然你需要建立一个MailConfig类用来表示一个邮箱的具体设置已及相关信息,这里就不在累述说明,详情参见参考资料中的代码。需要说明的式MailConfig除了要记录一个邮箱的地址,用户名和密码外,还提供2个关键字数组,如果为空,不加过滤,如果关键字有值,系统会根据发件人和邮件标题中是否包含关键字来进行显示邮件信息,已保证你的绝对自由。
  
  首先我们需要实现一个MailConfig类,表示邮件配置,每个MailConfig的对象代表一个邮件帐户,我们的系统将能显示多个邮箱的配置,每个MailConfig中使用一个数组来保存需要过滤的收件人和邮件地址。
  
  MailConfig类的中的变量如下:
  
  String popServer;
  String popUser;
  String popPassword;
  
  //设置需要过滤的关键字:发件人和邮件主题
  
  String [] strFrom;
  String [] strSubject;
  
  //是否显示邮件内容
  boolean isViewContent=false;
  
  同样,我们将使用一个对话框来显示邮件信息,MailDialog需要引用javaMail.jar,和activation.jar这两个类包,确保已经有这两个类包并加入到项目的类路径中。最后的MailDialog代码如下:
  
  package myplugin;
  
  
  import java.io.IOException;
  import java.util.Properties;
  
  import javax.mail.Folder;
  import javax.mail.Message;
  import javax.mail.MessagingException;
  import javax.mail.Session;
  import javax.mail.Store;
  import javax.mail.internet.InternetAddress;
  import javax.swing.JDialog;
  import javax.swing.JEditorPane;
  import javax.swing.JTextPane;
  /**
  * @author zhaoyong
  *
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
 ?/
  public class MailDialog extends JDialog
  {
  
  private JEditorPane jEditorPane = null;
  private JTextPane jTextPane = null;
  
  //可以显示多个邮件配置
  MailConfig[] mc= null;
  
  
  /**
  * This method initializes
  * 构造函数
  * @param mc : 需要显示的多个邮箱配置对象。
  */
  public MailDialog(MailConfig[] mc)
  {
  
  super();
  
  if(mc!=null)
  this.mc = mc;
  else
  System.err.println("邮件配置错误!") ;
  
  initialize();
  }
  /**
  * This method initializes this
  * 初始化
  * @return void
  */
  private void initialize()
  {
  try
  {
  //设定显示内容的面板
  this.setContentPane(getJTextPane());
  //取得所有的新邮件信息
  String s= getAllMailInfo();
  //将信息显示在对话框中
  this.jTextPane .setText(s);
  
  this.setTitle("邮件信息");
  this.setSize(251, 100);
  }
  catch (Exception e)
  {
  //发生错误显示错误信息
  this.jTextPane .setText(e.toString());
  e.printStackTrace();
  }
  
  }
  /**取得所有的邮箱的需要监控的邮件信息
  *
  * @return String
  */
  private String getAllMailInfo()
  {
  String allMailInfo="";
  
  if (mc.length <1)
  allMailInfo="没有配置邮箱!";
  else
  {
  for(int i=0;i<mc.length;i++)
  {
  //循环获取每个邮箱的邮件信息
  allMailInfo=allMailInfo+getMailInfo(mc[i]);
  }
  }
  //还没有收到相关的邮件
  if (allMailInfo.trim().length() ==0)
  allMailInfo="未检测到相关新邮件!";
  return allMailInfo;
  
  }
  /*
  *得到一个邮箱中满足条件的所有新邮件的字符串形式
  **/
  private String getMailInfo(MailConfig mc)
  {
  //最终输出的邮件信息
  String mailInfo="";
  
  //每个邮箱服务器上的Store和Folder对象
  Store store=null;
  Folder folder=null;
  
  try
  {
  
  Properties props = System.getProperties();
  //与邮件服务器生成一个Session
  Session session = Session.getDefaultInstance( props,null);
  
  //给出服务器,用户名,密码连接服务器
  store = session.getStore("pop3");
  store.connect(mc.getPopServer(), mc.getPopUser(),mc.getPopPassword());
  
  //取得默认的邮件Folder
  folder = store.getDefaultFolder();
  if (folder == null)
  throw new Exception("No default folder");
  
  //取得收件箱
  folder = folder.getFolder("INBOX");
  if (folder == null)
  throw new Exception("No POP3 INBOX");
  
  //以只读方式打开收件箱
  folder.open(Folder.READ_ONLY);
  
  //获取所有新邮件并处理
  Message[] msgs = folder.getMessages();
  
  for (int i = 0; i < msgs.length; i++)
  {
  Message message= msgs[i];
  //取得每封邮件的信息,需要引用MailConfig对象进行关键字过滤
  mailInfo = mailInfo+ getMessageInfo( message,mc);
  }
  
  }
  catch (Exception ex)
  {
  ex.printStackTrace();
  }
  finally
  {
  //安全的关闭邮件服务器资源
  try
  {
  if (folder!=null) folder.close(true);
  if (store!=null) store.close();
  }
  catch (Exception ex2) {ex2.printStackTrace();}
  }
  return mailInfo;
  }
  
  /**
  * 得到一封邮件的信息,需要根据MailConfig过滤
  * @param mailInfo
  * @param message
  * @return 邮件信息
  * @throws MessagingException
  * @throws IOException
  */
  private String getMessageInfo( final Message message ,final MailConfig mc)
  throws MessagingException, IOException
  {
  //返回的改邮件信息
  String mailInfo="";
  
  String from=((InternetAddress)message.getFrom()[0]).getPersonal();
  
  if (from==null)
  from=((InternetAddress)message.getFrom()[0]).getAddress();
  
  String subject=message.getSubject();
  
  //如果满足过滤信息则显示,否则返回空
  if(isElementinString(from,mc.getStrFrom())
  ||isElementinString(subject,mc.getStrSubject()) )
  {
  mailInfo=mailInfo+"发件人 : "+from+"/n";
  mailInfo=mailInfo+"邮件主题 : "+subject+"/n";
  mailInfo=mailInfo+"发送时间 : "+message.getSentDate() +"/n";
  
  //如果显示内容,则打印内容
  if(mc.isViewContent)
  mailInfo=mailInfo+message.getContent() +"/n";
  
  mailInfo=mailInfo+"------------------------------------/n";
  }
  return mailInfo;
  }
  
  private JTextPane getJTextPane()
  {
  if (jTextPane == null)
  {
  jTextPane = new JTextPane();
  }
  
  return jTextPane;
  }
  
  /**
  * 判断目标关键字数组中是否有指定的字符串,进行过滤
  * @param targetStr :
  * @param keys :
  * @return 如果有,返回true, 否则返回false
  */
  
  private boolean isElementinString(String targetStr,String [] keys)
  {
  //没指定过滤条件,显示所有
  if (keys==null)
  return true;
  //指定字符串为空,直接返回false
  if (targetStr==null)
  return false;
  for(int i=0;i<keys.length ;i++)
  {
  if (targetStr.indexOf(keys[i])>-1)
  return true;
  }
  return false;
  }
  
  }
  // @jve:decl-index=0:visual-constraint="10,10"--说明,这是Visual Editor添加的控制信息
  
  以上代码的注释已经保证你能够看清楚,这里就不加累述,有兴趣的可以自己试试,体验一切尽在掌握的快感。当然这个例子做的实在简单,因此也为你的进一步开发留有足够的余地。
  
  3.3 打包和发布
  
  到此,在mypulgin中增加了邮件信息菜单和对话框,系统的plugin.xml如下:
  
  <?xml version="1.0" encoding="UTF-8"?>
  <?eclipse version="3.0"?>
  <plugin
  id="myplugin"
  name="Myplugin Plug-in"
  version="1.0.0"
  provider-name=""
  class="myplugin.MypluginPlugin">
  
  <runtime>
  <library name="myplugin.jar">
  <export name="*"/>
  </library>
  <library name="lib/javaMail.jar">
  <export name="*"/>
  </library>
  <library name="lib/activation.jar">
  <export name="*"/>
  </library>
  </runtime>
  
  <requires>
  <import plugin="org.eclipse.ui"/>
  <import plugin="org.eclipse.core.runtime"/>
  </requires>
  
  <extension
  point="org.eclipse.ui.actionSets">
  <actionSet
  label="Sample Action Set"
  visible="true"
  id="myplugin.actionSet">
  <menu
  label="我的空间"
  id="sampleMenu">
  <separator
  name="sampleGroup">
  </separator>
  </menu>
  <action
  label="天气预报"
  icon="icons/sample.gif"
  class="myplugin.actions.SampleAction"
  tooltip="Hello, Eclipse world"
  menubarPath="sampleMenu/sampleGroup"
  toolbarPath="sampleGroup"
  id="myplugin.actions.SampleAction">
  </action>
  <action
  label="邮件信息"
  icon="icons/sample.gif"
  class="myplugin.actions.MailAction"
  tooltip="邮件信息"
  menubarPath="sampleMenu/sampleGroup"
  toolbarPath="sampleGroup"
  id="myplugin.actions.MailAction">
  </action>
  </actionSet>
  </extension>
  </plugin>
  
  实际上,我们在一个插件中加入了2个功能,因此就实现了我们的开发环境的自我扩展和定制。同样,参考Eclipse的帮助,你可以轻松的再次将插件打包导出,并将其加入自己的Eclipse 的plugins目录(可能需要解压缩),或通过help菜单的Update选项进行安装,注意导出时需要选定相关的类包。重新启动,你将发现自己的IDE已经多了自己的菜单,开发环境已经随着自己的意愿在改变了,程序员天生的满足感油然而生。
  
  现在,你可以在需要的时候点击菜单,了解你希望监控的邮件情况或者最近的天气情况,一切轻松的尽在掌握,Eclipse的插件,就是这样全能。
  
  4.总结
  那么,聪明的你有没有发现什么问题,对,上面的东西太粗糙,太简单了,你可以做进一步的优化设计和功能加强,比如,自己增加邮件配置文件而不是写在代码里面,动态监控弹出邮件预警(通过事先设定的紧急状态),你也许还会想起来很多的新的主意,比如我为什么不能有个能看电影的插件?或是Eclipse中飘出动听的音乐?别急,这些不一定需要你亲手去做,http://sourceforge.net/projects/rocexwang/ 有一个播放器插件,但是现在仅能播放音乐,国外已经有人用Eclipse开发游戏,也有人用Eclipse来做MIS系统的。http://www.matrix.org.cn/forum_view.asp?forum_id=25&view_id=10510 有一个国人开发的俄罗斯方块游戏,虽然简单了一点。当然,通过网址http://eclipse-plugins.2y.net/eclipse/index.jsp和http://www.eclipseplugincentral.com/你可以找到很多的插件,如果你知道什么更好的插件,请告诉我。
  
  Eclipse提供了一个纯的框架和插件结构,使得开发任何功能的插件都能成为现实。本文介绍了2个有趣的Eclipse插件的开发,可以使我们的工作环境增加了两个可爱的小功能,同时也使得你具备了基础的插件开发能力,借助Eclipse的强大功能,从此你可以把你的任何想法变为现实。同时请保持与别人的交流,我会很乐意了解你的新奇的插件,并收藏和学习任何好的插件,打造一个完全属于自己的个性化的开发环境。Eclipse将在不久的将来成为一个全能的Platform,这一点在全世界数以万计的开发人员的手中,正一点一点变为现实。


http://chatgpt.dhexx.cn/article/xAtfEHD2.shtml

相关文章

Eclipsej简介

Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。 Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多…

Eclipse简介、安装及常用快捷键

导航 我们为什么需要Eclipse?Eclipse简介与Eclipse基金会Eclipse下载安装1.下载2.安装2.1 安装JAVA EE插件 3.选择工作空间 Eclipse简单编辑与调试1.新建一个项目2.创建包Package3.创建类Class5.运行6.控制台7.调试8.Bug名称的由来 Eclipse安装插件Install New Soft…

Eclipse和MyEclipse简介

1.Eclipse 最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会管理。 Eclipse还包括插件开发环境(Plug-in Decelopment Enviroment,PDE&#…

【Eclipse】--Eclipse简介和安装

工欲善其事必先利其器,作为堂堂的Java高级开发人员,对Eclipse的使用绝对不能是菜鸟级别的。不怕不知道,就怕不知道,有点时间,把Eclipse好好的了解一下。 Eclipse是什么? Eclipse是一种通用工具平台——普遍…

eclipse的简介安装与配置

eclipse概述 开发工具 记事本、加强记事本集成开发环境: 集成开发环境的分类: Eclipse、idea、Myeclipse Eclipse下载 www.eclipse.orgDownload---->download packags--->选择版本(最新版本)--->developers For javeEE --->windows 64bit ------>选择中国镜像…

简介 eclipse

IBM-Eclipse简介: eclipse-galileo Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。 I…

Ubuntu安装pcb制图工具

sudo add-apt-repository --yes ppa:kicad/kicad-5.1-releases sudo apt update sudo apt install --install-recommends kicad 在这里插入图片描述 sudo apt install kicad-demos 安装完成之后运行 kicad 如下所示 本文链接:https://blog.csdn.net/u011046042/ar…

AxGlyph矢量绘图软件 | 绘图软件

文章目录 AxGlyph矢量绘图软件安装教程 所见即所得滚动式符号面板,多底色、面板符号定制和分页顺序调整格式化图形,通过节点控制可获取丰富的变形支持自由矢量画笔、混合矢量路径和矢量漫水填充整合精简版的AxMath*,可方便的在图形中嵌入数学…

RCOM串口绘图软件

此软件由本人花费业余时间编写。原创分享不易,望大家支持! 本软件属于Qt编写的开源软件,请勿用于商业用途。 软件使用QT Qcustomplot 编写。 编写此软件的初衷: 网上难以找到一款合适自己的串口绘图软件,在调试一…

计算机地理绘图软件叫什么,地理教师如何选择理想的绘图软件 ──基于对常用绘图软件的比较与分析...

一位前苏联地理教育家说过:“没有地图的地理课,也就没有地理了。”这说明地理教学与地图有着非常密切的关系。在日常的授课、编写试题、教学研究中,地理教师都需要用到各种地图,如政区图、统计图、示意图等。图像的绘制及表现效果…

一款在线制图工具介绍:如何在线免费绘制UML,云架构,ER模型,平面图,流程图等-...

介绍一下通过在线免费制图网站 Freedgo Design 绘制各类图形的方法。 什么是 Freedgo Design? Freedgo Design 是一in款在线绘制专业图形的网站。Freedgo Design可以绘制各种类型的图形,针对业务逻辑的流程图,软件设计ER模板,…

绘图用计算机软件的基本种类有,主编教您电脑绘图软件有哪些

绘图软件是指专业人员根据一定准则设计的用于计算机绘图软件程序,种类非常多,通过它们可以满足足广大用户的基本绘图要求。下面,我就给大家介绍电脑绘图软件有哪些。 电脑是根据指令进行高速计算的电子设备,功能强大,时…

计算机绘图软件应用于哪些领域,解答电脑绘图软件有哪些

电脑画图软件哪款好用呢?画图软件可以说是众多行业中不可或缺的工具,例如平面设计领域、建筑设计、机械设计领域、互联网产品设计领域等等,那么,电脑画图软件哪款比较好用呢?下面,小编就来为大家推荐几款较…

GG-Editor介绍-在线绘图软件

在浏览器中预览编辑复杂图形时,推荐一个 GG-editor 插件。 这个插件基于 React 框架,使用方便,可以创建编辑思维导图、流程图、拓扑图等图形。 使用 npm 安装 # 安装 node.js 或者全局安装 npm # 选择合适的工作目录 git clone https://g…

免费在线绘图软件推荐-processon

如果你厌烦了visio的安装破解麻烦,你可以试试这个神奇的工具。 https://www.processon.com/ 附上一篇文章。 processon作图完全装逼指南

png 转数组 工具_推荐8款实用在线制图工具

1 免费在线电路图设计工具 library.io免费在线电路图设计工具是一个基于网页的电路图仿真设计工具,用户只需推拽网站提供的电路元器件即可搭建成你所需要的电路图,简单省事。 https://library.io/ 2 免费在线制作海报风格工具 PosterMyWall:免费在线制作…

分享两个超好用的在线制图工具

ProcessOn,蓝湖 两个工具都是不需要下载和安装,直接打开浏览器就可以在线操作,所有数据可以实时云端存储, 并且支持多人在线实时协作。 再也不需要和同事, 领导之间来回传送文件,直接邀请,一起协…

kaggle:注册kaggle账号的流程

给大家推荐一个超级超级棒的人工智能课程,老师语言风趣幽默,全是干货:https://captainbed.duanshu.com/#/course/8a30e729349f4184b9ae15317a1fc8e7?promoter_id4c65a8bf8491490496a3698363ebdf42 一、kaggle网站地址:https://w…

kaggle如何使用utility script

1.准备utility script (必须是py格式) 这一步首先要打开一个新notebook,在File修改类型为script(见下面注意点),并将你的脚本设置为utility script。然后可以选择在File导入本地的脚本。导入后,修改要慎重,有时会爆“…

手把手教Kaggle账号注册-不翻墙

众所周知,kaggle注册主要问题是人机验证,即报错Captcha must be filled out. 注册前,请先按照如下步骤先配置,以解决人机验证不显示的问题。第一步:下载edge,https://www.microsoft.com/zh-cn/edge/home?f…