使用JBuilder来制作EXE文件
倘若说看到标题后,以为jb真的提供了一种把java应用程序打包成exe文件的主流方法的话 , 你会失望的,下面的一个小技巧只是一个技巧而已。 使用JBuilder来制作可执行文件 这个是Borland不公开的使用技巧,能够通过JBuilder来制作exe文件来启动Java文件。JBui lder并不支持本地编译机制。但是有一个隐藏的技巧可以让你从可执行文件来启动Java程序 ,可以出现或者不出现console窗口。想做到这些,需要JBuilder的bin目录下的这些文件: JBuilder.exe JBuilderW.exe (可选) JBuilder.config jdk.config JavaLauncher.dll “JBuilder.exe”是一个通用的可执行外壳文件,用以启动Java程序,”JBuilderW.exe“ 好 像是javaw.exe一样,它把”JBuilder.exe”包装起来,但是运行时候不显示那个console的 窗口。使用这些文件的关键是文件名。“JBuilder.exe”查找一个文件叫”JBuilder.confi g”的配置文件,里面包含了运行Java程序的必须信息。同样的”JBuilderW.exe”查找”JB uilder.exe”来启动不带Console窗口的Java程序。如果把JBuilder.exe重命名为”foo.exe ”,那”foo.exe”将去寻找”foo.config”配置文件,同样”JBuilderW.exe”被重命名为 ”fooW.exe”,它会去寻找”foo.exe”文件。 说到这里,聪明的读者应该猜到怎样利用JBuilder.exe来启动应用程序了。只要把JBuilder .exe,JBuilerW.exe,JBuilder.config改名成相应的文件名,在JBuilder.config里面指定主 类和类路径,就能够通过执行JBuilder.exe(或者被改名后的exe文件)来启动Java应用程序 了 。下面是用本机为例。 Borland JBuilder 5被安装在E:\jbuilder5\目录下,在E:\jbuilder5\bin\下建立一个temp 目录,然后把JBuilder.exe,JBuilder.config,JavaLauncher.dll,jdk.config四个文件拷贝 到E:\jbuilder5\bin\temp\目录下,然后在这个目录下建立一个hello目录,在这个目录下 生 成一个hello.java文件,即E:\jbuilder5\bin\temp\hello\hello.java文件, file://hello.java package hello; public class hello{ public static void main(String s[]){ System.out.println("Hello, Exe file!"); } } 编译成class文件 编译所有java文件 然后打开Jbuilder.config文件,作相应的修改: 在JBuilder.config里面找到下面两行 # Start JBuilder using the its main class mainclass com.borland.jbuilder.JBuilder 修改为 # Start JBuilder using the its main class mainclass hello.hello addpath E:/jbuilder5/bin/temp/ addpath命令是把目录加入类路径中,这个命令和其它config里面可以识别的命令可以在JBu ilder/bin目录下的config_readme.txt里面找到详细说明。 然后将jdk.config里面的javapath修改成相对的路径,例如原来是 javapath ../jdk1.3/bin/java 修改成 javapath ../../jdk1.3/bin/java 最后 将JBuilder.exe,JBuilder.config修改成所需要的文件名,例如foo.exe和foo.config文件 。 现在执行foo.exe文件 可以看到执行的结果 执行foo.exe后的运行结果 至此,通过修改JBuilder来使用exe文件启动自己的Java应用程序已经完成了。 但是好玩的地方并不在这个地方,下面的小技巧可能更有趣,将Jar文件打包进入exe文件! 假设利用上面的文件,生成hello.jar包,执行过程和运行结果jar cvf hello.jar hello\*.class 将类文件打包成exe文件 然后将jar包附加到JBuilder.exe后面去,执行过程 copy /b ..\JBuilder.exe+hello.jar foo.exe 将jar文件转化成exe文件 在foo.config(JBuilder.config)文件里面把前面加入的类路径去掉,并加入下面的路径: addpath E:/jbuilder5/bin/temp/foo.exe 然后执行,执行结果 foo.exe 变成exe文件的jar文件执行结果 看到了么?一个含jar包的exe文件被执行了! 这个过程的大致原理是:exe文件的重要信息都在文件头部,所以把乱七八糟的东西放exe文 件尾部是不要紧的;而jar/zip文件的重要信息是在文件尾部的,这样它们两不相干,能够 容 易的被执行。 请注意:读者如果使用这个功能,得自己承担可能带来的风险,因为Borland对这个功能不 提 供官方的支持!
|
posted @
2006-05-16 19:50 wqwqwqwqwq 阅读(605) |
评论 (0) |
编辑 收藏
试题
第一,谈谈final, finally, finalize的区别。
final?
修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为
abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定
初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize?
方法名。Java 技术允许使用 finalize()
方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在
Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize()
方法是在垃圾收集器删除对象之前对这个对象调用的。
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
Nested
Class (一般是C++的说法),Inner Class
(一般是J***A的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http:
//www.frontfree.net/articles/services/view.asp?id=704&page=1
注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象
第四,&和&&的区别。
&是位运算符。&&是布尔逻辑运算符。
第五,HashMap和Hashtable的区别。
都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
第六,Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
第七,什么时候用assert。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的:
assert(a > 0); // throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可
以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否
启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状
态。
第八,GC是什么? 为什么要有GC? (基础)。
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
第九,String s = new String("xyz");创建了几个String Object?
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
第十二,sleep() 和 wait() 有什么区别? 搞线程的最爱
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级
(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
第十三,Java有没有goto?
Goto?java中的保留字,现在没有在java中使用。
第十四,数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。
String有有length()这个方法。
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方
法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重
载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写
(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方
法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
第十七,给我一个你最常见到的runtime exception。
ArithmeticException,
ArrayStoreException, BufferOverflowException, BufferUnderflowException,
CannotRedoException, CannotUndoException, ClassCastException,
CMMException, ConcurrentModificationException, DOMException,
EmptyStackException, IllegalArgumentException,
IllegalMonitorStateException, IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IndexOutOfBoundsException, MissingResourceException,
NegativeArraySizeException, NoSuchElementException,
NullPointerException, ProfileDataException, ProviderException,
RasterFormatException, SecurityException, SystemException,
UndeclaredThrowableException, UnmodifiableSetException,
UnsupportedOperationException
第十八,error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
第十九,List, Set, Map是否继承自Collection接口?
List,Set是
Map不是
第二十,abstract class和interface有什么区别?
声
明方法的存在而不去实现它的类被叫做抽象类(abstract
class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract
类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract
类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接
口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有
程序体。接口只可以定义static
final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。
然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到
接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不能
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
第二十三,启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
第二十四,构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
第二十五,是否可以继承String类?
String类是final类故不可以继承。
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
第二十八,编程题: 用最有效率的方法算出2乘以8等於几?
有C背景的程序员特别喜欢问这种问题。
2 << 3
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
第三十二,编程题: 写一个Singleton出来。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
posted @
2006-05-16 19:45 wqwqwqwqwq 阅读(213) |
评论 (0) |
编辑 收藏
一,JBuilder光标定位不准确的修改::
在中文的Windows下面安装JBuilder后,
在IDE的代码编辑器里面光标定位会不准确,
很多人通过修改Editor的缺省字体来修改这个问题,
但是JBuilder预设的字体是最美观的。鱼与熊掌不能兼得,那么改怎么办才好呢?
其实最简单的办法就是把JBuilder的Editor里面的
缺省字体里面的语法高亮列表里面"Reserved word"的Bold的属性去掉,
就可以了,而且字体还更漂亮!
具体路径:"Editor Option"->"Color"->"Screen Element"->"Reserved word"
->"Attributes"->"Bold",把"Bold"uncheck就可以了!
Enjoy it!!
二,如何在Jbuilder中使用自定义的Server.xml文件?
这个问题相信困扰很多人了,解决办法如下
1,在jbuilder中运行web app
2,在输出窗口察看server0808的输出目录
我的jbuilder7是C:/myapp/Tomcat/conf/server8080.xml
3,把这个文件备份,
其中有这样一行
4,删除这一行,停止web app
5,此时Tomcat目录下没有conf目录了,建立这个目录,将删除了3中这句话的文件放在
conf目录,还叫做server8080.xml,把自己需要的连接池等信息加入
6,运行web app,我在jbuilder7中不会替换这个文件。
ok...........................
Using a Custom server.xml file with Tomcat in JBuilder
Question: How do a use a custom server.xml with Tomcat in JBuilder 4,5 and 6?
Answer:
Make a copy of the JBuilder-generated server.xml file while your Web app
is running, modify the line which says the file was generated by JBuilder,
make you mods, and then AFTER you quit the Web app you were just running,
save your modified copy back to server.xml. After that, JBuilder won't
modify that file.
Note: Remember that when you shut down Tomcat you'll need to recreate
the directory that the server.xml file was in before you can save it back out.
After you've made the above modifications, JBuilder will leave the directory
alone.
三,如何修改jbuilderx的字体
#1: 安装JBX
#2: 改变一下,Editor|Display 里面的字体,主要是让jbx搜索系统字体
#3: 关闭JBX
#4: 用户主目录下(我的是:C:\Documents and Settings\Administrator\)
.primetimeX/user_zh.properties
添加一行:
editor.display;fixed_fonts.3=\u5b8b\u4f53
就可以啦!
同样也可以添加其它字体,只要在
editor.display;known_fonts
列表中有的,都可以添加,顺序编号就行了
#5: 重起JBX
posted @
2006-05-16 19:42 wqwqwqwqwq 阅读(468) |
评论 (0) |
编辑 收藏
这是一篇关于怎样使用JBuilder开发j2me程序的例子。本人使用JBuilder2005,2005自带WTK2.1,自己下载2.2版
本,2.2那个默认的模拟器很好用。另外,Jbuilder X下的WTK也是2.0的版本好象。Jbuilder 9的WTK是1.04。
首先开启Jbuilder.建立一个Project。
然后填写名字和路径。继续:
然后选择JDK路径,本身已有WTK2.1,你可以选择。但是你也可以自己选择其他的WTK版本。
点击jdk后面的路径按钮,继续:
然后ok,next.工程建立完毕.
接着点击file->New:
然后在对话框左边选择Micro,你就能看到右边出现MIDlet,Displayable.
接上面的:如图示
点击MIDlet or Displayable,则让你输入MIDlet的名字.如图:
继续下一步,让你输入一个Displayable的名字,包括类型(form,canvas等),是否自动加载Command
等等
然后Jbuilder自动生成所需代码,以及Jbuilder自加的一些东西.你可以添加或修改之.
这里我将本站一篇关于介绍Gamecanvas的文章的代码拿过来,做少量修改,作为本文章的一个演示;
TestMIDlet.java文件:
package temps;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
* Title:
*
* Description:
*
* Copyright: Copyright (c) 2005
*
* Company:
*
* @author not attributable
* @version 1.0
*/
public class TestMIDlet extends MIDlet
{
private Display display;
public void startApp()
{
try
{
display = Display.getDisplay(this);
Displayable1 gameCanvas = new Displayable1();
gameCanvas.start();
display.setCurrent(gameCanvas);
}
catch (Exception ex)
{
System.out.println(ex);
}
}
public Display getDisplay()
{
return display;
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
exit();
}
public void exit()
{
System.gc();
destroyApp(false);
notifyDestroyed();
}
}
Displayable1.java内容:
package temps;
import javax.microedition.lcdui.*;
import java.util.Random;
import javax.microedition.lcdui.game.*;
/**
* Title:
*
* Description:
*
* Copyright: Copyright (c) 2005
*
* Company:
*
* @author not attributable
* @version 1.0
*/
public class Displayable1 extends GameCanvas implements Runnable
{
private boolean isPlay; // Game Loop runs when isPlay is true
private long delay; // To give thread consistency
private int currentX, currentY; // To hold current position of the 'X'
private int width; // To hold screen width
private int height; // To hold screen height
private Random random=new Random(System.currentTimeMillis());
private final int[] sequence={0,1,2,1,0,1,2,1,0,1,2,1,1,1,1,1,1};
private int counter=0;
private int enemyX,enemyY;
private int enemyDirect=0;
private boolean isdown=false;
private boolean isalive=true;
// Sprites to be used
private Sprite playerSprite;
private Sprite backgroundSprite;
private Sprite enemySprite;
// Layer Manager
private LayerManager layerManager;
// Constructor and initialization
public Displayable1() throws Exception
{
super(true);
width = getWidth();
height = getHeight();
currentX = width / 2;
currentY = height / 2;
enemyX=width/4;
enemyY=height/4;
delay = 100;
Image playerImage=null;
Image backgroundImage=null;
Image enemy=null;
// Load Images to Sprites
try
{
playerImage = Image.createImage("/transparent.png");
backgroundImage = Image.createImage("/background.png");
enemy=Image.createImage("/frames.png");
}
catch(Exception e)
{
System.out.println("get Image error!"+e.getMessage());
}
playerSprite = new Sprite(playerImage, 32, 32);
System.out.println(playerSprite.getRawFrameCount());
enemySprite=new Sprite(enemy,50,21);
backgroundSprite = new Sprite(backgroundImage);
layerManager = new LayerManager();
layerManager.append(playerSprite);
layerManager.append(enemySprite);
layerManager.append(backgroundSprite);
}
// Automatically start thread for game loop
public void start()
{
isPlay = true;
Thread t = new Thread(this);
t.start();
}
public void stop()
{
isPlay = false;
}
// Main Game Loop
public void run()
{
Graphics g = getGraphics();
while (isPlay == true)
{
input();
drawScreen(g);
try
{
Thread.sleep(delay);
}
catch (InterruptedException ie)
{
}
}
}
// Method to Handle User Inputs
private void input()
{
int keyStates = getKeyStates();
playerSprite.setFrame(0);
if(isalive)
{
if(counter==0)
{
enemyDirect=Math.abs(random.nextInt()%4);
}
counter++;
switch(enemyDirect)
{
case 0:
enemyY=Math.max(0,--enemyY);
break;
case 1:
enemyY=Math.min(++enemyY,height-enemySprite.getHeight());
break;
case 2:
enemyX=Math.max(0,--enemyX);
break;
case 3:
enemyX=Math.min(++enemyX,width-enemySprite.getWidth());
break;
}
counter=(counter++)%(sequence.length());
enemySprite.setFrame(sequence[counter]);
}
else
{
enemyY+=counter;
enemyY=Math.min(enemyY,height-enemySprite.getHeight());
if(enemyY
counter++;
enemySprite.setFrame(3);
}
// Left
if ((keyStates & LEFT_PRESSED) != 0)
{
currentX = Math.max(0, currentX - 1);
playerSprite.setFrame(1);
}
// Right
if ((keyStates & RIGHT_PRESSED) != 0)
if (currentX + 5 < width)
{
currentX = Math.min(width, currentX + 1);
playerSprite.setFrame(3);
}
// Up
if ((keyStates & UP_PRESSED) != 0)
{
currentY = Math.max(0, currentY - 1);
playerSprite.setFrame(2);
}
// Down
if ((keyStates & DOWN_PRESSED) != 0)
{
isdown=true;
}
if ((keyStates & DOWN_PRESSED) != 0)
{
if(isdown)
{
if (currentY + 10 < height)
{
currentY = Math.min(height, currentY + 1);
playerSprite.setFrame(4);
}
}
}
if((keyStates & FIRE_PRESSED)!=0)
{
isalive=!isalive;
counter=0;
}
if(!(enemyX+enemySprite.getWidth()currentX+playerSprite.getWidth() || enemyY>currentY+playerSprite.getHeight()) && isalive)
{
counter=0;
isalive=false;
}
}
// Method to Display Graphics
private void drawScreen(Graphics g)
{
g.setColor(0xffffff);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0x0000ff);
// updating player sprite position
playerSprite.setPosition(currentX, currentY);
enemySprite.setPosition(enemyX,enemyY);
layerManager.setViewWindow(0, 0, width, height);
layerManager.paint(g, 0,0);
g.setColor(0xffffff);
flushGraphics();
}
}
此程序里敌人随机向4个方向移动,而玩家控制的角色可任意移动, 如果两者发生碰撞,则敌人死亡.
另外按fire键可直接让敌人生或死
关于运行,Jbuilder里有个运行配置:
一般不用修改,如果多个Midlet,你可以在这里添加.
关于用Jbuilder打包.
一样file->new:
这个在2005和9,x里有所不同,选择Archive,右边选择MIDlet,然后ok.
这里选择要打包文件的目录,当前默认是所有的class文件和资源文件,你也可以删除掉,自己选择一部分.
然后next,直到最后. 然后运行,在运行配置中默认重新rebuild,打包等等.然后你能看到左上框里有jar文件和jad文件.
运行结果:
呵呵,用你控制的主角去碰撞这只大飞虫试试:
posted @
2006-05-09 18:31 wqwqwqwqwq 阅读(529) |
评论 (0) |
编辑 收藏
在无线通信领域有两项重大的技术应用,一个是宽带CDMA技术,一个是IP技术。前者使无线通信获得更多带宽,3G的目标是静态速率达到2Mbps,而现
在的2.5G技术(如国内正在建设的GPRS和CDMA2000
1X)都可达到115kbps的速率;后者使无线通信和因特网融合起来,实际上当前WAP2.0技术就采用已经很成熟的TCP、TLS和HTTP协议,而
移动IP和IPv6技术将促使更多设备接入互联网,如各种设备、家电等。
就是在这样的环境下J2ME技术得以快速发展,J2ME用来为接入和即将接入互联网的设备提供应用开发平台和执行环境,本文则主要论述如何利用JBuilder进行快速的J2ME应用开发。
1. J2ME分层结构及MIDP简表
J2ME是SUN的JAVA2平台微型版(JAVA2平台3个版本之一,另两个是标准版J2SE和企业版J2EE),采用3层结构设计。最低层为配置层
(Configuration),包括虚拟机(VM)和类库两部分,这一层与设备层(硬件及操作系统)关系紧密,由SUN提供参考规范和源代码,设备厂商
根据设备特征进行相应的移植。当前J2ME提供有两个配置:连接设备配置(CDC)和有限连接设备配置(CLDC)。前者主要面向有较大内存和处理能力而
只需有限功能的设备,如电视置顶盒、冰箱、汽车导航设备等,这些设备都有连接网络和相互交互的需求,其内存在2M以上;后者主要面向对内存和处理能力有较
大限制的手持设备,如现在使用的手机、PDA等,现在及将来大多数这些设备都已经能够接入互联网,其内存范围160Kb(其中128Kb用于虚拟机及类
库,至少32Kb用于CLDC规范所要求的应用程序堆栈空间)到2M。二者主要区别在于能提供给VM及应用程序的存储空间,CDC所用VM及类库实际是参
考J2SE标准,去除了不需要的功能如AWT。CLDC所用VM(称作KVM)则有较大区别,包括类验证机制。对于下一代移动终端设备如智能电话、高端
PDA,则是CDC所应用对象,因为它们将有超过2M的内存。
设备层之上是简表层(Profile),再之上则是应用层
(Application)。简表层扩展了配置层功能为上层应用提供API,如果说配置层面向设备,简表层则面向应用。可以根据需要在CDC或CLDC基
础之上提供多种简表,一个配置层之上也可以有多个简表。当前CDC之上有基础简表(Foundation
Profile)和基于FP的Personal Profile和RMI
Profile。CLDC之上则主要提供有移动信息设备简表(MIDP),即用于手机、PDA等移动终端的设备简表,提供API以支持无线应用的开发。
CLDC类库一部分来自J2SE,这部分类库是经过裁减的,去除了不必要的功能,主要包括java.lang包中的系统类、数据类型
类、异常处理类,java.util包的集合类、时间类和附加工具类,java.io包的I/O处理类。CLDC专有类则主要是"通用连接框架(GCF)
",为CLDC提供网络连接功能,这些网络接口都是Connection类的子类,由类Connector所提供的方法调用,这些接口或类位于包
javax.microedition.io。
CDC类库则是CLDC的超集,因此为CLDC开发的应用程序可以移植到CDC平
台,由于CDC采用标准的J2SE
VM,因此其开发与标准的J2SE开发一致,只是在用javac工具编译源代码时需要使用CDC的类库,即使用-bootclasspath参数指向
CDC类库。
MIDP扩展了CLDC的功能,它继承了GCF并在此基础上增加了类HttpConnection,用以提供
HTTP连接功能(尽管从理论上CLDC/MIDP可以提供socket、数据报、文件、NFS等多种连接类型,但现在标准的CLDC/MIDP仅支持
HTTP协议,一些设备实现则提供了socket和HTTPS协议的支持),MIDP类库
总结如下:
java.io、java.lang、java.util,属于MIDP的核心包,分别用来提供系统I/O、语言支持和工具支持。包中的类来自CLDC并稍有增加,但都来自J2SE。
javax.microedition.midlet,定义了MIDP应用程序,以及应用程序和它所运行于环境之间的交互。
javax.microedition.lcdui,为MIDP应用程序提供用户界面API。
javax.microedition.rms,用来为MIDlet提供持久存储的机制,应用程序可以存储数据,在以后需要的时候获取这些数据。
javax.microedition.io,提供了基于CLDC通用连接框架的网络支持。
2. MIDP应用程序开发
这里讨论的J2ME无线应用开发主要是基于CLDC/MIDP的开发,其应用程序可运行于移植有KVM的手机、PDA等,这类设备由MIDP定义,即移动信息设备(MID),可看作一垂直应用市场。
可在PC(Windows、UNIX或Linux平台)上开发MIDP应用程序,编译成类文件形式,下载到目标设备上,经过类文件的验证(验证是否有不符合KVM规范的方法调用等)后即可解释执行。
生成的.java文件至少有一个是扩展了javax.microedition.midlet.MIDlet类的子类,并且实现几个规定的接口,比如下面的一个MIDlet程序 :
import javax.microedition.midlet.*; //应用程序生命周期,和J2SE一样,包java.lang.*是默认加载的
import javax.microedition.lcdui.*; //MIDP用户界面
public class FirstMIDlet extends MIDlet implements CommandListener {
private Display display; // 引用MIDlet的Display 对象
private TextBox textBox; // Textbox 显示一条消息
private Command cmdExit; // 设定按钮用于退出MIDlet
public FirstMIDlet() { // MIDlet构造程序
display = Display.getDisplay(this);
cmdExit = new Command("Exit", Command.SCREEN, 1);
textBox = new TextBox("My First MIDlet", "Hello, J2ME!", 50, 0);
textBox.addCommand(cmdExit);
textBox.setCommandListener(this);
}
public void startApp() { // 必须要实现的接口,被应用管理软件调用来启动MIDlet
display.setCurrent(textBox);
}
public void pauseApp() { } // 必须要实现的接口
public void destroyApp(boolean unconditional) { } //必须要实现的接口
public void commandAction(Command c, Displayable d) { //检查一下是否选择了退出命令
if (c == cmdExit) {
destroyApp(false);
notifyDestroyed();
}
}
}
这是最简单且功能完整的MIDlet应用程序,其中接口startApp、pauseApp、destroyApp是必须要实现的,应用程序管理器
(JAM)通过这些接口调用和控制应用程序,与Applet类似。除这个主类外还可以有其它辅助类,其要求和J2SE一致。
然后使用
javac工具编译,javac工具来自J2SE,至少JDK
1.3版,编译时应该使用参数-bootclasspath并指向MIDP类库。之后使用preverify工具预验证,以保证生成的.class文件符
合CLDC要求,这一步为每个类文件添加堆栈映射(stackmap,此属性为CLDC新定义)属性,增加类文件大小约5%。
此时可以用midp工具(来自MIDP实现的可执行文件)模拟运行,之后即可打包,需要编写一清单文件(清单文件参考CLDC/MIDP规范),用jar工具(来自J2SE)把预验证后的类文件、资源文件、清单文件打包。
要发布应用程序还需要编写一描述文件(JAD),JAD的要求同清单文件一致,可以自定义参数供应用程序调用。其中一个参数MIDlet-Jar-
URL以URL方式指向JAR文件,移动终端设备通过JAM连接网络获取JAD,下载MIDlet-Jar-URL指向的JAR到设备中,通常JAM要先
判断JAD与清单文件是否一致,应用程序是否有效,然后才决定下载。
运行时执行环境、JAR包、JAD文件和应用程序生命周期,这些要素构成MIDlet套件,由JAM管理,每个MIDlet套件可包含一个或多个MIDlet。
上面是一个MIDP应用程序开发的关键点,具体的开发方法及开发工具大致分为如下几种:
Ⅰ. 基本开发工具
最基本的开发方式是下载SUN提供的CLDC/MIDP参考实现及源代码,可根据需求编译生成一个CLDC/MIDP实现,并移植到设备上。配置好开发
环境(CLDC/MIDP实现、JDK1.3)后即可采用上述方法和工具进行开发,多采用命令行方式,这是最原始的方法。
Ⅱ. J2MEWTK开发工具
这是SUN提供的便捷开发工具,用于Windows环境,同样需要先安装JDK1.3。源程序仍需要使用常规的文本编辑器,把编辑好的源文件及资源文件
按一定要求放在规定目录下,J2MEWTK所提供的是菜单或按钮方式的命令。J2MEWTK中有相应的编译(和预验证一个步骤)、打包、模拟运行的菜单
(或按钮),以及其它辅助工具。
Ⅲ. IDE工具
可以使用Forte For Java、JBuilder等IDE工具和J2MEWTK集成使用,它们除了有J2MEWTK的功能外,就是提供有可视化的开发工具。
3. 使用JBuilder MobileSet
JBuilder是Java程序员常用工具之一,在于它强大的可视化编程工具,集成的编译、运行和调试环境。要为JBuilder提供J2ME无线应用
开发支持,需要在JBuilder基础之上安装MobileSet,建议安装2.0版,当前支持CLDC/MIDP的1.0.3版本,而JBuilder
的版本应该是6。JBuilder MobileSet 2可从下面网址免费下载:
http:
//www.borland.com/jbuilder/mobileset/
同时还要下载相应的MobileSet序列号和许可密钥(免费),根据提示安装MobileSet并注册后,运行JBuilder会找到
"Help|MobileSet Guilde"菜单项。使用菜单"File->New..."打开"Object
Gallery"对话框,会出现一个新的页面标签"Micro",此时图标"MIDlet"和"MIDP
Displayable"是灰色的,只有生成一个MIDP项目后才能使用这两个图标。
3.1 JBuilder MobileSet的特征
JBuilder MobileSet是一个开放工具,能够与其它供应商提供的J2ME开发工具包集成在一起,当前提供了对下列厂商工具包的支持:
Sun提供的J2ME无线开发工具包1.0.3版(J2MEWTK)
诺基亚的J2ME开发套件(http://forum.nokia.com/)
西门子的SMTK开发工具包(http://www.siemens-mobile.de/)
其中J2MEWTK已经包含在MobileSet 2的安装文件中,如果要使用J2MEWTK提供的开发类库,并且还没有安装J2MEWTK,可以在安装MobileSet 2时选择完全安装。MobileSet 2提供了下列辅助开发的工具:
用于CLDC/MIDP类的CodeInsight工具
类/包浏览器
JDK转换工具
动态适配到任何J2ME简表,包括MIDP
和开发其它Java应用程序一样,JBuilder通过MobileSet提供了快速开发模板,包括MIDP项目模板,MIDP
Displayable模板,MIDlet模板。它提供了RAD(快速应用开发)的可视设计器,支持MIDP
UI元素。通过MobileSet还支持MIDP应用程序打包和OTA配置(Over the
Air,上载和下载文件和MIDlet套件,用来配置应用程序到设备上)。
MobileSet能够用在JBuilder的个人版、专家版和企业版,但是一些功能不能用在个人版如JDK设置切换,打包器等。
3.2 配置JDK
前面已提到编译MIDP应用程序时需要设置特定的CLDC/MIDP类库,以避免使用默认的J2SE类库,在JBuilder中同样要进行类似设置。这
是通过JDK配置选项实现的,JBuilder的设计独立于JDK,尽管每个JBuilder版本发布时会默认安装一个当时较新的JDK(类库),但还可
以通过它的配置机制设置其它JDK,包括旧版本、更新版本或者OEM版的JDK,从而实现了JBulder的扩展性。
专家版和企
业版的JBuilder可同时配置多个JDK,根据需要设置其中一个为默认即可,而个人版的却要在需要时重新配置每个JDK。安装MobileSet后可
选择安装J2MEWTK、诺基亚和西门子的JDK,然后为设置的每个JDK自定义一个名称,并把其主目录指向这个JDK中\bin的父目录,需要注意的是
JDK目录中不能有空格如c:\Program Files\ J2mewtk。
3.3 MIDP项目
JBuilder开发都以项目概念为中心,项目文件包含一个(属于这个项目的)文件列表以及项目属性,其中项目属性包括项目模板、缺省路径、类库和连接配
置等,JBuilder使用这些信息加载、保存、编译和运行项目。使用Jbuilder开发环境添加、移除文件,或者设置、更改项目属性都会更改项目文
件。可以在项目面板中看到项目文件作为主节点显示。
生成项目的便捷方式是使用项目模板工具,可用来设置项目名称、类型和模板,以及JDK、工作目录、备份路径和编译输出路径等。其中项目类型可选择.jpx或者.jpr,二者内容一样,区别是前者使用XML格式文件,因此适合于共享的项目。
而JDK则是前面所设置中的一个,并且只有选择CLDC/MIDP的JDK才能使用Object
Gallery中的Micro选项。每个项目至少一个MIDlet主类,所以首先应使用MIDlet模板生成一个MIDlet主类。通过模板可以设置这个
主类的类名、标题、屏幕类型和命令处理方式,其中屏幕类型有4个选择:
(javax.microedition.lcdui.)Canvas、Form、List、TextBox,只有Form的扩展类才能添加其它的组件(Item的子类)。命令处理方式也有4个选择:
Ⅰ. -- 通过其它的类设置commandListener,比如MIDlet类。
Ⅱ. Interface implementation -- 生成一个类并在类中实现commandListener接口,这种方式生成的类的大小会比适配器方式生成的小。
Ⅲ. Standard adapter -- 这种方式生成的代码采用标准适配器的形式:
class Foo {
private void jbInit() {
addListener(new Adapter(this));
}
}
class Adapter {
...
}
Ⅳ. Anonymous adapter -- 这种方式生成的代码采用匿名适配器的形式:
class Foo {
private void jbInit() {
addListener(new Listener() {
...
});
}
}
后两种适配器形式可以通过项目属性"Code Style"设置。如果要在这个MIDP应用程序中添加更多的屏幕,可以使用Displayable模板添加,或者通过MIDlet模板添加更多的MIDP应用程序到项目中。
生成应用程序框架后,就可根据本文第2部分要求添加所需代码,并使用JBuilder提供的便捷方式进行编译(预验证)、打包、模拟运行和发布,JBuilder提供有内置web服务器和ftp服务器,以方便开发者测试应用程序的发布。
如果使用MIDlet或Displayable模板生成一个Form类型的Displayable对象,则可以使用JBuilder的"MIDP设计器
"定制用户界面,即从组件板上以拖拉方式生成UI元素,可用鼠标调整这些元素的位置或者进行复制、删除等操作,这就是JBuilder强大功能之所在。
如果是使用模板生成Displayable类,会自动生成jbInit()方法,当在Form中添加UI元素时,设计器会把代码添加
进jbInit()方法。如果希望打开一个现有Displayable类到设计器,它已经有UI元素,但是没有jbInit()方法,首先需要生成一个
jbInit()方法,然后把所有的UI元素转移进去。
posted @
2006-05-09 18:17 wqwqwqwqwq 阅读(296) |
评论 (0) |
编辑 收藏
摘要: Java中一些关于日期、日期格式、日期的解析和日期的计算 (转)
跑系统时,难免遇到了数据量大的情况,只好让爱机彻夜工作了,自己闪人。毕竟对它不放心,这时得用到日志,日志里的时间肯定是要的啦。至少得知道他什么时候罢工吧(今天一来,我电脑就在昨天不明时间罢工了!)。下面是转自一位网友的:
Java中一些关于日期、日期格式、日期的解析和日期的计算
Java
语言的Calendar...
阅读全文
posted @
2006-05-09 17:53 wqwqwqwqwq 阅读(4581) |
评论 (0) |
编辑 收藏
其实无论什么东西,我们都不能否认它能带来的好处,但也决不能因此就忽视了不好的地方,甚至盲目的追崇和信赖.
java的IDE 开发环境也是一样,它们让我们的程序开发变得简单等等很多好处,但是我们真的就完全的对它推崇吗? 答案当然是否定的.对于我们,尤其是初探java 的朋友们,如果过于追求IDE的使用,可能会使我们忽略java 本身的精髓,而只是学会如何的去使用IDE.
同时在大型程序的开发过程中,如果IDE本身的错误或不兼容现象的产生,会让我们很难办.程序的优化问题一直是一个很值得研究的问题,尤其是在我们这个有限资源的社会当中.
今天由于时间限制,我仅写到这里,IDE还有很多值得我们关注的地方,但是即便如此,我们也并不能排斥它,因为它确实为我们实际地工作和学习带来了很多方便之处.相反,我们要有想法有对策的更好的利用IDE.
posted @
2006-05-08 22:50 wqwqwqwqwq 阅读(235) |
评论 (0) |
编辑 收藏