| |
概述、vj6的获得与安装
一 概述
在以前的javaapplet教程中给大家介绍了一点点vj6.0的使用方法,收到很多网友来信。这几天有时间,给大家介绍一下vj6的使用方法。但这里给大家介绍的,只是vj本身的使用方法,不涉及编程方法与程序说明,如果想学基本的语法什么的,小弟就对不住了,有时间的话,再给大家说说。 在java的众多编译调试工具中,vj6.0算得上是一个比较不错的。因为它具有很多的优点,比较常见和突出的(我认为),可以概括如下:
1. 与windows应用程序的界面是一致的,微软的东西,这些方面都差不多,因此,对于初学者来说,是非常容易上手的。一般的菜单目录什么的呀,都不用解释了,一看就会。
2. 自带的mfc类库,是java中没有的,实现了与windowsapi的接口,使得编写界面像vb一样的简单了。虽然这是一个很多人批评的东西,但对于初学者来说,却有很大的一个好处,因为他不用设计界面了, 可以直接学习java的语法,要知道,编写程序的界面是一个很麻烦的事情。
3. 调试方便,这是最没有说的了,在程序的调试方面,微软的visual stdio系列都是非常棒的,没有人会怀疑。这是非常不错的。
4. 自动补偿功能以及一些其他编译器没有的功能。如果你用过vb的话,将会对其中的vb补偿功能非常的赞赏,自动语句完成功能也称为自动列举成员功能。而vj6中也引入了这些功能。关于这些方面的详细介绍,请看后面的内容。
至于另外的一些,我看来也没有什么特别了,因此也就不提了。
二 vj6.0的获得
没有办法,微软一向都是小气鬼,他的东西都是要钱的,vj6当然也是要钱的了,不过,它推出的好象是测试版本。也有一个90天的试用版本可以免费试用,用起来没有什么不同之处,但是用一段时间就要重新安装,有点麻烦,就这样凑合着用吧。还行。至少可以免不少的钱。(笔者就用的这种)
好了。基本的就这些了。下面给你说说安装
三 vj6.0的安装
安装基本上没有什么好说的了,如果你安装过vb或者是vc什么的话,那完全可以自定义安装,如果没有安装过的话,先建议你选择默认安装选择项,包含了基本的功能。安装过程和装别的软件没有什么不同,可能有的人安装最后会出现一个是否安装某某公司的数字签名的对话框,那装也行,不装也行,选择"no"退出,点击"重新启动计算机"对话框的确定按钮,重新启动就可以了。下面是它的启动界面,如图1:
vj6中各种菜单与工具栏的介绍
一 基本菜单的介绍 vj6中的菜单都是活动菜单,下面是它的主菜单,如图2:
图2
菜单选项挺多的,但你不一定能看见这么多,下面是它的基本的菜单,如图3:
图3
由于这些界面都比较的熟悉,不详细介绍,只做一些基本的说明。 "文件"菜单:这个菜单主要是管理文件的处理,新建文件,打开文件,保存文件与关闭文件,打印之类,和其他的微软的软件基本一样,如图4;
图4
编辑菜单也是一样,见图5,功能选项也没有不同的地方;
图5
视图菜单"view"也用不找介绍了吧,见图6,一见就知道是干什么的了;
图6
工程菜单"project"这里面用的比较多的是它的前四个选项,这是给工程里面添加各种东西,add class为添加类,add form为添加窗体,add web page 为添加html页面,第一个选项"add item"则是选择添加上面给出的三种中的选择窗口,实际上,你选择任何一个选项都一样,弹出的窗口都是同一个窗口,可以任意选择。 "builder"菜单就是编译菜单了,在这里编译。 "debug"就是调试与运行选择菜单了。 "tools, windows , help"这三个选项基本上就不用我说了,也和别的软件没有什么区别了。 至于图2中的另外一些选项,那是在编辑网页的时候用的,与vj没有多大的关系了,这里就不说了,相信大家自己也非常的熟悉,一看就会用。
二 工具栏 vj中的工具栏要是全部显示出来的话,可能会满屏幕都是,因此,它只显示了一个,如图8:
图8
这些图标也是大家非常熟悉的,其中有三个图标,是显示浮动窗口的快捷按钮。像录音机播放按钮的,则上运行程序的快捷按钮了。 自己定义工具栏的时候,只要在工具栏的地方点鼠标右键,选择自己定义选项,就可以弹出对话窗口,自己定义工具栏。
三 浮动面板
主要的浮动面板有四个,如图9: 一个工程浏览,这里就像资源管理器一样方便,使你管理这个工程里面的所有东西,包括各种文件与文件夹。 另外一个则是属性窗口了,属性窗口会根据你编辑的内容而会不同,当你编辑窗体时,它会像vb中的那样,包括窗体的各种信息选项,如果是编辑网页,那么选项就会变成背景,字体属性等等。 左边一个是工具箱,只要用鼠标按住一个控件,往你窗体上需要的地方一放就可以了。不用多解释。 下面的浮动面板则是一 个任务与信息窗口了,显示一些适时信息。 各种面板的调整: 你只需要用鼠标将一个浮动面板的控制快往另外一个面板上面一放,就可以将两个面板合成一个面板,同理,如果已经合成了面板,只要拖动它下面的控制块,就可以将它拉出来来,形成一个单独的面板。
文本编辑器是主窗口,也是最重要的窗口,这个窗口包含了java和html的源代码,这个编辑器里面的各种文字的颜色是不一样的,文本的不同颜色代表了不同的语句类型,绿色代表的是注释的语句,蓝色代表的是关键字,黑色则是可执行语句了。当你通过键盘输入字符的时候,文本编辑器可以帮助你实现一种统一的缩进风格。根据你所选择的风格类型设置,编辑器能够自动地缩进语句,并且把花括号对整齐。上面说的所有这些功能,都可以自己设置,设置步骤为选择“tools”菜单中的“option”选项,并且在text editor子菜单中选择java format选项,如图7,
图7
这里不但是设置字体格式的地方,还是设置所有环境参数的地方,各种参数都是通过这里而改变的。各种功能参数的改变都比较的详细,比如说vj的自动补偿功能,就是选中text editor中的per language中的auto list members。相信大家也自己看的懂,这里就不罗嗦了。
关于wfc
wfc顾名思义,就是windows 基础类库的意思,wfc类库是vj6中,微软公司为了使java能够使用windows api而引入的,这个wfc的好处就是我们的所见即所得形式的窗体界面及其组件。vj中的像vb一样的窗体编辑,完全是wfc的功劳。但是,由于wfc是引用的windows的api(应用程序接口),这就使得用wfc生成的java程序只能在微软的操作系统中使用,但我们要的是java的跨平台特性,使得java程序能在别的操作系统中也能使用,这就矛盾了,也正是由于这样,微软被sun起诉,对薄公堂,结果当然是微软输了,但是wfc没有被取消,只是在创建新的项目时,如果使用了wfc,那么vj6就特别会显示一个对话框,提醒你注意。
由于wfc的缘故,笔者在这里就不具体分析它了,在以后的讲解中,笔者也不提及wfc,而vj6中有很多的使用wfc的地方,因此,vj6中,就有很多的功能不说了,比如说数据库,因为那全是与wfc有关的,去掉了wfc,确实就去掉了vj6的很大一部分功能了,但没有办法,我们用不着,再一点就是wfc虽然好用,但也非常麻烦的,几乎相当于重新学习一些新的类库与方法,但这学了并没有用,至少现在,它一点市场都没有。
区别你用了wfc的很方便的地方就是看看java程序开始的地方是否引入了wfc包,如果看到有"import com. ms. wfc. app. *;"那么就说明你用了wfc,ms本身就是 microsoft 的意思。
好了,你现在应该已经明白我说这些的意思了吧。
下面就让我们看看具体怎么用vj6来编写与调试程序吧!
一个application的全部调试过程
我们现在举例来说明一个application的全部调试过程 打开vj6,它启动时,会自动打开如下的窗口,如下图:
在new选项中的application中,有三个选项,第一个是windows application,这就是使用微软自带类库进行wfc程序的界面设计应用程序,第二个选项是 console application 这是dos下的程序设计,没有界面要求,只要完成核心代码要求就可以了,不必设计界面,当然也用不着wfc类库了。第三个选项为"application wizard"这个选项功能就是应用程序设计向导了,只要你照着它说的做,一步一步往下走,就可以了,用这个向导设计出来的程序,具有很好的界面,一说到界面,当然就也用了wfc,这也不在我的讨论只列了。给大家举一个dos下的应用程序的例子,在上图中,我们选择console application,填好名字与路径之后,点击 确定按钮,vj6就会自动帮你生成一些格式化的代码,如下: /** * this class can take a variable number of parameters on the command * line. program execution begins with the main() method. the class * constructor is not invoked unless an object of type ´class1´ * created in the main() method. */ public class class1 { /** * the main entry point for the application. * * @param args array of parameters passed to the application * via the command line. */ public static void main (string[] args) { // todo: add initialization code here } } 它前面的"/**"与"*/"之间的说明性语句一大堆,告诉你一些基本的内容,基本上不用理会,在主函数"main"中,有一个todo,那就是我们要加入代码的地方了,我们就加入一个例子说明一下,在todo下一行,我们键入一行“system. out. println ("hello!");”(请注意大小写),如果你学过c或者java的话,那就知道是什么意思了,这个程序是一个最基本的hello程序,在输入的时候要注意到它的自动补偿功能,当你敲完system后,再敲一个点时,后面就会出现一个下拉选择框,你再敲一个"o"的时候,选择项就自动停在了"out"选项上面。这时候只要按一下空格,就可以看到"out"三个字母已经自动输入了,当你再敲一个点的时候,同样又会出现一个下拉选择框,按下"p"字母后,选择项就停留在了以"p"开头的选项上,按下方向键的向下键,找到"println"按下空格,就会自动补偿输入了。同理,当你此时按下"("时,就有一个选择项提示,1 of 10,后面是方法,表示这是10种方法中的第一种方法,按下方向键的向下或者向上键,就可以看到不同方法的提示了,每种提示中都有参数的个数,参数的类型等提示,非常的方便快捷,使你的输入一般不会出现语法错误。(这要求你已经打开了自动补偿功能,如果没有打开,请参看前面打开的方法)如果你不小心输入错了,则在最下面的浮动窗口"task list"中,会用红色的下化线显示你的输入有问题,或者是蓝色的警告。
在加入这一行以后,这个程序就已经完成了,下面的工作便是编译与运行了,选择"build"菜单中的"build"或者"rebuild"选项,这就是编译了,编译后,如果有错误,会在最下面的浮动窗口"task list"中提示你,如果没有错误,在状态栏上会显示出"solution update successed "表示已经编译成功,然后选择"debug"菜单中的"start"或者按下f5键,运行,这时,会弹出一个dos窗口,显示出这个程序的结果:"hello!"。其实,你也可以将编译与运行看结果合成一个动作,那就是直接运行,如果没有编译的化,它会自动对你的程序进行编译。工具栏上有快捷图标"",用鼠标一点。就会自动编译并运行了。运行结果如下:
虽然我对大家建议不要用wfc,但这里还是给大家举一个用wfc的例子,在前面的图中,我们选择第一个选项"windows application",填好名字与路径之后,应该会出现如下所示的窗口界面。
这个时候,如果你运行的化,会发现它有一个基本的窗口,能最大化,最小化,以及关闭程序等功能。 如果你仔细看看属性浮动窗口,会发现和vb一样的许多窗口属性,我在这里就不一一说明它的作用了,你自己按着属性窗口中的内容一项项自己调整或者改变,然后看看你的界面变了些什么,多用几遍后,就知道这个属性窗口是干什么用的了。 现在给大家举一个简单的例子,两个文本输入框,一个按钮,你能够在第一个文本框中输入内容,点击按钮后,第二个文本框中的内容将会与第一个文本框中的内容一模一样,也就是复制第一个文本框的内容。这个例子做起来,很简单,步骤如下: 1. 拖动工具栏上的文本框控件到你的form界面上,拖两个,那么系统会自动将第一个命名为"edit1"和"edit2",如下图:
2. 将第二个文本框选中,然后在属性窗口中选择"enabled"选择项,然后将后面的选择项的内容由"true"改为"false"使之不可以被编辑,也就是不能输入文字的意思。如下图:
3. 增加一个按钮,由工具箱上直接拖动到"form"中就可以了。按钮名字自己随便了。如下图:
4. 双击按钮,将会打开代码编辑器,并且显示如下的内容:
private void button1_click(object source, event e) {
}
在这个按钮事件代码中增加一行,如下:
edit2.settext(edit1.gettext());
好了,这个简单程序也已经编写完了,试着点一下运行图标看看,就会看到你自己想要的界面与输出结果了。程序的完整代码如下:
import com.ms.wfc.app.*; import com.ms.wfc.core.*; import com.ms.wfc.ui.*; import com.ms.wfc.html.*;
/** * this class can take a variable number of parameters on the command * line. program execution begins with the main() method. the class * constructor is not invoked unless an object of type ´form1´ is * created in the main() method. */ public class form1 extends form { public form1() { // required for visual j++ form designer support initform();
// todo: add any constructor code after initform call }
/** * form1 overrides dispose so it can clean up the * component list. */ public void dispose() { super.dispose(); components.dispose(); }
private void button1_click(object source, event e) { edit2.settext(edit1.gettext()); }
/** * note: the following code is required by the visual j++ form * designer. it can be modified using the form editor. do not * modify it using the code editor. */ container components = new container(); edit edit1 = new edit(); edit edit2 = new edit(); button button1 = new button();
private void initform() { this.settext("form1"); this.setautoscalebasesize(new point(6, 12)); this.setclientsize(new point(192, 165));
edit1.setlocation(new point(48, 16)); edit1.setsize(new point(100, 19)); edit1.settabindex(0); edit1.settext("edit1");
edit2.setenabled(false); edit2.setlocation(new point(48, 56)); edit2.setsize(new point(100, 19)); edit2.settabindex(1); edit2.settext("edit2");
button1.setlocation(new point(64, 120)); button1.setsize(new point(75, 23)); button1.settabindex(2); button1.settext("button1"); button1.addonclick(new eventhandler(this.button1_click));
this.setnewcontrols(new control[] { button1, edit2, edit1}); }
/** * the main entry point for the application. * * @param args array of parameters passed to the application * via the command line. */ public static void main(string args[]) { application.run(new form1()); } }
至于其他的程序,也就是不用wfc,而又要编写有界面的程序,也就是用awt写界面,那就没有办法了,只能自己写awt代码了。基本过程为: 1. 选择"new"选项中的"visual j++ projects"选项中的"empty projects"。选择好名字与路径之后,系统就会帮你建立一个新的工程了。但是这个里面什么文件也没有。 2. 这个工程是空的,这时候,你可以导入代码文件也可以自己建立代码文件。建立类或者"form"之类的文件,请选择"project"菜单中的"add item"选项,建立自己想要的文件就可以了,代码嘛,当然只能自己手工输入了,没有别的办法。不过,这里倒是什么文件都可以建立,包括java applet在内。因此,如果你的工程不止一个文件或者比较大的话,是肯定要用到这个选择项的!这是一个必须学会的用法了。
一个applet的编写与调试过程
applet与application虽然有很大的不同,但操作上基本同application的操作差不多,但编辑上还是有一些差别的。因此,这里也给大家举一个例子。这个例子稍为有点复杂,希望看的时候已经学过了一些java的基本知识了。这个例子的目的是要实现一个跑马灯的java applet程序,这个例子的效果如下:
1 选择新建菜单“new”,然后选择“new”下面的选项:applet on html,设置好名称与路径之后,按下确定按钮,系统将自动帮我们生成一两个文件,一个是applet的初始代码文件,另外一个就是html网页文件了。如下图:
2 在工程浏览窗口中双击applet1文件,这时就可以打开这个代码文件了。代码文件比较长,这里不列出,要查看代码,请点击这里。双击page1.html文件,也就打开这个html文件了,这个文件打开时,会显示如下图所示:
这个窗口里面有三个选项了,如果你用过frontpage,那么你将对这个非常的熟悉。这里就像frontpage一样,是一个网页编辑器,工具箱中也有你编辑网页所要的控件。不用多解释,看看source(源代码),打开后,有的可能显示的是该applet的内容。而有的可能显示的是代码,这与vj6的初始设定有关,在applet上面点击鼠标右键,选择“always view as text”后,就可以看到代码了,代码如下:
<applet code=applet1.class name=applet1 width=320 height=200 viewastext> <param name=label value="this string was passed from the html host."> <param name=background value="008080"> <param name=foreground value="ffffff"> </applet>
这个不用多解释,按照自己的要求改就行了。此时不能点击quick view进行快速预览,因为该applet还没有被编译成class文件。
3 此时将这个applet程序运行,按下f5键,直接运行,那么此时vj6会自动编译此程序,并且用默认的浏览器打开这个html文件并显示出来。
4 这个时候我们就要进行真正的添加代码的工作了。只有添加了必要的代码后,才能达到预期的目标嘛!请打开源代码文件applet1,双击就行!
先要做的工作,当然是设置变量,变量放在主类当中,如下:
font ft; //文字字体对象实例 string thestring, font, style; //移动的字符串、字体类型及样式 int size, speed; //文字的大小,移动速度 int xset, max, min;//文字所在位置的x坐标,右边界和左边界
定义好变量后,就要像给出的源代码一样,加入一些初始的代码了。
private final string param_string="string"; private final string param_font="font"; private final string param_style="style"; private final string param_size="size"; private final string param_speed="speed";
现在要做的事情就是从网页文件html中取得各种参数了,就像初始代码取得参数一样,这些可以参照初始代码而写出来!如下。
string param; param = getparameter ( param_string); if(param !=null) thestring= param;//取得字符串参数 param = getparameter ( param_font); if(param !=null) font= param;//取得字型参数 param= getparameter ( param_size); if (param !=null) size=integer. parseint ( param);//取得字提大小参数 param= getparameter ( param_style); if(param!=null) style= param;//取得字型样式参数 param= getparameter ( param_speed); if(param !=null) speed=integer.parseint (param);//取得文字移动速度参数 int vice_style = font.plain ; if(style. equalsignorecase ( "bold")) vice_style=font.bold ; if (style.equalsignorecase ("italic")) vice_style=font.italic ;//处理得到的字型参数,忽略大小写
ft=new font(font,vice_style,size); fontmetrics fm= getfontmetrics(ft);//生成fontmetrics类对象实例 min= -fm.stringwidth (thestring); max= getsize().width ; offset= max;
接下来要做的事情,当然是要做最重要的工作了。编写程序的主要部分,字体滚动的过程。这部分的代码就不详细解释了。希望你已经学过java语法了。
public void paint(graphics g) { int yset=getsize().height ;//yset为输出字符串的y坐标变量 yset=(yset-size)/2; g.setfont (ft); g.setcolor (color.red); g.drawstring (thestring,xset,yset+40); //+40是用来调整输出时的高度用的。 xset--; if(xset }
public thread textmoverunnable=null; public void start() { if(textmoverunnable==null) { textmoverunnable=new thread (this); textmoverunnable.start (); } } public void run() { while(true) { try{ repaint();thread.sleep (speed); }catch(interruptedexception e) {} } } public void stop() { if (textmoverunnable!=null) { textmoverunnable.stop(); textmoverunnable=null; } }
这部分代码应该加在与initform()并列的地方,可以在之前,也可以在之后。在加完这些代码之后,程序的大体就完成了。但如果你此时编译的话,肯定会出现错误,在task list上会显示出来,并且错误为“class ´thread´ doesn´t have a constructor that matches ´thread(applet1)´ (j0082)”这是因为加进去的代码涉及到了线程,而主程序不知道,没有相应的接口,(j0082)为错误的序号,查找相应的工具,有这个错误的详细解释。要解决这个错误,只要在主类后面加上一个接口就可以了。如下:
public class applet1 extends applet implements runnable
注意后面的“implements runnable”。再编译,错误已经解除了,但这时候显示的结果还是和开始的时候显示的效果一样。这是因为还没有在html中设置该设置的内容。
查看applet1.java的内容: import java.awt.*; import java.applet.*;
/** * this class reads param tags from its html host page and sets * the color and label properties of the applet. program execution * begins with the init() method. */ public class applet1 extends applet implements runnable { /** * the entry point for the applet. */ font ft; //文字字体对象实例 string thestring, font, style; //移动的字符串、字体类型及样式 int size, speed; //文字的大小,移动速度 int xset, max, min;//文字每次移动的位移量,右边界和左边界
public void init() { initform();
usepageparams();
// todo: add any constructor code after initform call. }
private final string labelparam = "label"; private final string backgroundparam = "background"; private final string foregroundparam = "foreground"; private final string param_string="string"; private final string param_font="font"; private final string param_style="style"; private final string param_size="size"; private final string param_speed="speed";
/** * reads parameters from the applet´s html host and sets applet * properties. */ private void usepageparams() { final string defaultlabel = "default label"; final string defaultbackground = "c0c0c0"; final string defaultforeground = "000000"; string labelvalue; string backgroundvalue; string foregroundvalue;
/** * read the , * , * and tags from * the applet´s html host. */ labelvalue = getparameter(labelparam); backgroundvalue = getparameter(backgroundparam); foregroundvalue = getparameter(foregroundparam);
if ((labelvalue == null) || (backgroundvalue == null) || (foregroundvalue == null)) { /** * there was something wrong with the html host tags. * generate default values. */ labelvalue = defaultlabel; backgroundvalue = defaultbackground; foregroundvalue = defaultforeground; }
/** * set the applet´s string label, background color, and * foreground colors. */ label1.settext(labelvalue); label1.setbackground(stringtocolor(backgroundvalue)); label1.setforeground(stringtocolor(foregroundvalue)); this.setbackground(stringtocolor(backgroundvalue)); this.setforeground(stringtocolor(foregroundvalue)); string param; param = getparameter ( param_string); if(param !=null) thestring= param;//取得字符串参数 param = getparameter ( param_font); if(param !=null) font= param;//取得字型参数 param= getparameter ( param_size); if (param !=null) size=integer. parseint ( param);//取得字提大小参数 param= getparameter ( param_style); if(param!=null) style= param;//取得字型样式参数 param= getparameter ( param_speed); if(param !=null) speed=integer.parseint (param);//取得文字移动速度参数 int vice_style = font.plain ; if(style. equalsignorecase ( "bold")) vice_style=font.bold ; if (style.equalsignorecase ("italic")) vice_style=font.italic ;//处理得到的字型参数,忽略大小写
ft=new font(font,vice_style,size); fontmetrics fm= getfontmetrics(ft);//生成fontmetrics类对象实例 min= -fm.stringwidth (thestring); max= getsize().width ; xset= max; }
/** * converts a string formatted as "rrggbb" to an awt.color object */ private color stringtocolor(string paramvalue) { int red; int green; int blue;
red = (integer.decode("0x" + paramvalue.substring(0,2))).intvalue(); green = (integer.decode("0x" + paramvalue.substring(2,4))).intvalue(); blue = (integer.decode("0x" + paramvalue.substring(4,6))).intvalue();
return new color(red,green,blue); }
/** * external interface used by design tools to show properties of an applet. */ public string[][] getparameterinfo() { string[][] info = { { labelparam, "string", "label string to be displayed" }, { backgroundparam, "string", "background color, format "rrggbb"" }, { foregroundparam, "string", "foreground color, format "rrggbb"" }, }; return info; }
label label1 = new label();
/** * intializes values for the applet and its components */ void initform() { this.setbackground(color.lightgray); this.setforeground(color.black); label1.settext("label1"); this.setlayout(new borderlayout()); this.add("north",label1); }
public void paint(graphics g) { int yset=getsize().height ; yset=(yset-size)/2; g.setfont (ft); g.setcolor (color.red); g.drawstring (thestring,xset,yset+40); //+40是用来调整输出时的高度用的。 xset--; if(xset }
public thread textmoverunnable=null; public void start() { if(textmoverunnable==null) { textmoverunnable=new thread (this); textmoverunnable.start (); } } public void run() { while(true) { try{ repaint();thread.sleep (speed); } catch(interruptedexception e) {} } } public void stop() { if (textmoverunnable!=null) { textmoverunnable.stop(); textmoverunnable=null; } } }
5 修改html内的代码:
<applet code=applet1.class name=movetext width=400 height=100 viewastext> <param name=label value="this string was passed from the html host."> <param name=background value="008080"> <param name=foreground value="ffffff"> <param name=string value="你好, 这是一个例子!"> <param name=font value="宋体"> <param name=style value=bold> <param name=size value=40> <param name=speed value=20> </applet> 当你设置好这些后,应该是没有什么问题了吧。此时按下f5键,在弹出的默认浏览器内,你将看到这个例子的效果了。怎么样,没有骗你吧!好了,到此,applet的编写与编译的全部过程你应该掌握了吧。
|
|