编写小型Java IDE
作者:Y___Y
联系:yinwei_88@sina.com
市面上有很多Java的IDE,比如Eclipse,Borland JBuilder,NetBeans等等,它们的功能都很强大,但都有一个普遍的缺点,就是要求机器的配置比较高,所以对于想学习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