编写小型Java IDE

来源:互联网 发布:伊娃格林 知乎 编辑:程序博客网 时间:2024/04/28 02:22

编写小型Java IDE

作者:Y___Y
联系:yinwei_88@sina.com

市面上有很多JavaIDE,比如EclipseBorland  JBuilderNetBeans等等,它们的功能都很强大,但都有一个普遍的缺点,就是要求机器的配置比较高,所以对于想学习Java而机器配置不好的朋友,只能去下载JSDK,然后在控制台下,敲命令编译运行,麻烦至极。因此笔者用一些简单的技术来开发了一个小的Java IDE,将代码编辑,编译运行集成到一起,只需点几个按钮就可以,省去了在控制台下,敲命令,同时在代码编辑方面做了一些工作,实现了代码着色,自动缩进,使书写程序一目了然。大家可以在此基础上,作一些改进,从而使IDE的功能更加强大。实际上,大家可用笔者的代码整理的源代码,实现代码自动整理(笔者并没有做这方面的功能)。该IDE适合Java于初学者。

代码整理参见http://blog.csdn.net/Y___Y/archive/2006/11/09/1376105.aspx

本文全部源代码http://yyhlm.ys168.com

为了提高各个功能的效率,笔者采用C++语言的来开发,鉴于  C++ Builder  在制作界面的优越性,最终选用C++ Builder 6来开发。

注意,使用前先下载JSDK,安装,配置好后才能使用。

各功能的实现。

1.  界面布置

   

2.编译与运行

本质上依然采用的命令行编译与运行,所做的工作只是将其自动化。显然先将命令写为批处理文件,然后用ShellExecute来执行该批处理。

部分代码(运行功能)如下

char dir[256];

    AnsiString s;

    FILE *fp;

    GetModuleFileName(NULL,dir,256);//获得IDE可执行文件的路径

    s=ExtractFilePath(AnsiString(dir))+"Run.bat";//批处理的文件名

    fp=fopen(s.c_str(),"w");

    if(!fp)

    {

       ShowMessage("无法执行");

       return;

    }

 

//str存储的是Java源文件的路径

    s="javac "+ExtractFileName(AnsiString(str)); //编译命令

   fprintf(fp,"%s/n",s.c_str());

    s="java "+ExtractFileName(AnsiString(str)); //执行命令

    s[s.Length()-4]='/0';

    fprintf(fp,"%s/n",s.c_str());

    fprintf(fp,"pause/n");//暂停,以便查看编译和运行结果

    fclose(fp);

    s=ExtractFilePath(AnsiString(dir))+"Run.bat";

    ShellExecute(NULL,"open",s.c_str(),NULL,NULL,SW_SHOW);

图示:

3.代码着色

这个功能最麻烦了。

笔者将其分解为以下三步,

1)对一行着色

2)每个关键字着色

3)注释着色

先看(2)的实现代码

下面的CodesEdit为代码编辑框(RichEdit组件)

其中int n代表要着色的行数。

其中int pos代表要着色的行数的开始的位置,即该行距第一行的是一个字符之间的字符数。

AnsiString s为要着色的关键字,cl为所着的颜色。

void TForm1::CharColor(int n,unsigned int pos,AnsiString s,TColor cl)

{

     char *p=CodesEdit->Lines->Strings[n-1].c_str(),*q=p;

     while(p)

     {

        p=strstr(p,s.c_str());//搜寻该关键字

        if(!p)

            break;

       //isyh(p,q)为自定义函数(略去代码)判断关键字是否在双引号内,如果在,显然不着色。

if((p==q||!isalnum(*(p-1)))&&!isalnum(*(p+s.Length()))&&isyh(p,q)==0)//判断关键字前后是否不为数字或字母

        {

            CodesEdit->SelStart=pos+(p-q); //即该关键字距第一行的是一个字符之间的字符数

            CodesEdit->SelLength=s.Length();

            CodesEdit->SelAttributes->Color=cl; //着色

        }

        p=p+s.Length();

     }

}

注释着色代码关键字着色相似,略去。

再来看(1)对一行着色代码(摘录)

void __fastcall TForm1::LCodesColor(int n)

{

    unsigned int pos=LinePos(n);// LinePos(n)为自定义函数,获得该行距第一行的是一个字符之间的字符数。

 

CharColor(n,pos,AnsiString("class"),clBlue);

//这里省略……………………..

CharColor(n,pos,AnsiString("int"),TColor(RGB(255,0,255)));

CharColor(n,pos,AnsiString("main"),clRed);

LCommetColor(n,pos);// 注释着色

}

完成以上步骤后自学对每行作一下循环,即可完成对整个代码着色,对于多行注释/***多行注释***/需要作一下小处理就可以了(代码略去)。对于实时着色,处理一下键盘事件即可。

代码缩进,实现较易,在此略去。

本文全部源代码http://yyhlm.ys168.com