2007年12月9日
#
Java Swing 学习
java.awt.Graphics是绘制图形的重要类。它提供最底层的线,圆和矩形等的绘制。绘制图形和填充图形在坐标和像素的设置上是有个很小的区别。绘制时,实际所得的像素要比坐标从右边和下边多出一行,所以设置时坐标应该是这样:g.drawRect(0,0,size.width-1,size.height-1);填充时,只在所绘制的坐标冈,所以直译时应该是这样:g.fillRect(0,0,size.width,size.height)。这样绘制和填充好的图形才对。虽然现在还用不着这些技术,但是对于更深刻的了解AWT和Swing提供了基础。
当框架和监听器不写在同一个类的时候,会出现在监听器类中难以访问框架类中swing组件。目前我认为是不同的实例化对象的组件也不同,所以要在监听器类中访问框架类中的组件,可用以下两种方法:
1:利用组件的的setActionCommand和监听器类中的getActionCommand方法来使框架中的组件在监听器类中得以识别。但这种方法有局限性。
2:利用监听器类中一个构造方法传递框架类。
public MyActionListener(JFrame jframe){
this.jFrame=jframe;
}
这样,在监听器类中可以像一般变量那样调用组件。
java中equals方法与==逻辑运算符
在Java中,我们比较两个对象时有两种方法,一种是直接使用逻辑运算符==号,还有一种就是用equlas()函数,该函数在Object中就定义了,所以每个类都会有这个函数,好了现在我们看看普通对象和字符串在使用这两种比较方式有什么不同,看下面代码,读者可以猜猜看结果是什么:
public class Equals {
/**
* @param args
*/
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
Object o3 = o1;
Object o4 = o2;
System.out.println( "o1.equals( o1 ): " + o1.equals( o1 ) );
System.out.println( "o1.equals( o2 ): " + o1.equals( o2 ) );
System.out.println( "o1.equals( o3 ): " + o1.equals( o3 ) );
System.out.println( "o1.equals( o4 )" + o1.equals( o4 ) );
System.out.println();
System.out.println( "o1 == o1: " + ( o1 == o1 ) );
System.out.println( "o1 == o2: " + ( o1 == o2 ) );
System.out.println( "o1 == o3: " + ( o1 == o3 ) );
System.out.println( "o1 == o4: " + ( o1 == o4 ) );
System.out.println();
String s1 = new String( "abc" );
String s2 = new String( "abc" );
String s3 = new String( "def" );
String s4 = s1;
String s5 = s2;
String s6 = s3;
System.out.println( "s1.equals( s1 ): " + s1.equals( s1 ) );
System.out.println( "s1.equals( s2 ): " + s1.equals( s2 ) );
System.out.println( "s1.equals( s3 ): " + s1.equals( s3 ) );
System.out.println( "s1.equals( s4 ): " + s1.equals( s4 ) );
System.out.println( "s1.equals( s5 ): " + s1.equals( s5 ) );
System.out.println( "s1.equals( s6 ): " + s1.equals( s6 ) );
System.out.println();
System.out.println( "s1 == s1: " + ( s1 == s1 ) );
System.out.println( "s1 == s2: " + ( s1 == s2 ) );
System.out.println( "s1 == s3: " + ( s1 == s3 ) );
System.out.println( "s1 == s4: " + ( s1 == s4 ) );
System.out.println( "s1 == s5: " + ( s1 == s5 ) );
System.out.println( "s1 == s6: " + ( s1 == s6 ) );
}
}
有没有答案了,如果有了,看看你的答案正确吗,
o1.equals( o1 ): true
o1.equals( o2 ): false
o1.equals( o3 ): true
o1.equals( o4 )false
o1 == o1: true
o1 == o2: false
o1 == o3: true
o1 == o4: false
s1.equals( s1 ): true
s1.equals( s2 ): true
s1.equals( s3 ): false
s1.equals( s4 ): true
s1.equals( s5 ): true
s1.equals( s6 ): false
s1 == s1: true
s1 == s2: false
s1 == s3: false
s1 == s4: true
s1 == s5: false
s1 == s6: false
为什么会出现上面的结果呢,其实在Java中,逻辑运算符==号在比较对象的时候是严格的比较这两个对象是不是同一个对象,说白了,它比较的是两个对象在内存中的地址,只有当两个变量指向同一个内存地址即同一个对象时才返回true,否则返回false,所以就可以看到当我们用new方法创建了o1和o2由于分配了两个不同的内存空间,所以它们在用逻辑运算符==号来判断两个对象是否相等时自然应该返回的是false,而在比较o1和o3时,由于o3指向的实际是o1所指向的地址,所以返回true,在字符串中逻辑运算符==的作用和普通对象是一样的。
那么对于o1和o2用equals()方法比较返回的为什么也是false呢,我们来看一段代码:
public boolean equals( Object o2 )
{
this == o2;
}
这是Object中equals()函数的实现,可以看到实际上它的功能还是比较两个对象的地址,自然你现在可以推出为什么o1和o2比较时还是返回false了。
那现在问题可能来了,那为什么s1和s2比较时返回的是true呢,他们在内存空间的地址可是不一样的啊,呵呵,其实这个理解起来更简单了,因为在String类中重载了equals()函数,使它比较的是两个字符串的内容,而不是两个字符串对象在内存中的地址,至于如何写这个函数我就不多说了,大家可以自己写写看,实现方式有多种,不过Sun公司当然只有那一种实现方式,哈哈
JAR,标准输入输出,文件输入输出
今天软件终于做出来了,用JAR打包,打了十几次都没打成功。在网上找了
一个多钟头才找到了问题的所在,竟然是一个回车,以下是MANIFEST.MF文件的内
容:
Manifest-Version: 1.0
Created-By: 1.5.0_06 (Sun Microsystems Inc.)
Main-Class: StuLogon
在含有Main方法的类StuLogon后边一定要加上回车,让光标到下一行。就这么个
问题浪费了我一个钟头时间。
标准输入输出
从键盘输入(读)到内存,再从内存输出(写)到显示器
文件输入输出
从人输出(写)到文件,再从文件输入(读)到内存,再从内存输出(写)到显
示器
jdk与jre的区别
对于java初学者来说,往往不懂区分jdk和jre的区别,实际上这两个东西差别很大的,有必要了解一下:
简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JDK就是Java Development Kit
JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。
如果安装了JDK,会发同你的电脑有两套JRE,一套位于 /jre 另外一套位于 C:/Program Files/Java/j2re1.4.1_01 目录下,后面这套比前面那套少了Server端的Java虚拟机,不过直接将前面那套的Server端Java虚拟机复制过来就行了。而且在安装JDK可以选择是否安装这个位于 C:/Program Files/Jav a 目录下的JRE。如果你只安装JRE,而不是JDK,那么只会在 C:/Program Files/Java 目录下安装唯一的一套JRE。
JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。所以当你装完JDK后,如果分别在硬盘上的两个不同地方安装了两套JRE,那么你可以想象你的电脑有两台虚拟的Java PC机,都具有运行Java程序的功能。所以我们可以说,只要你的电脑安装了JRE,就可以正确运行Jav a应用程序。
1、为什么Sun要让JDK安装两套相同的JRE?这是因为JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe等),而且都放置在 /lib/tools.jar 里。从下面例子可以看出,先将tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结果: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 这个意思是说,你输入javac.exe与输入 java -cp c:/jdk/lib/tools.jar com.sun.tools.javac.Main 是一样的,会得到相同的结果。从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。而且可以发现/lib目录下的程序都很小,不大于2 9K,从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程序,也必须要自行附一套JRE才行,所以位于C:/Program Files/Java目录下的那套JRE就是用来运行一般Java程序用的。
2、如果一台电脑安装两套以上的JRE,谁来决定呢?这个重大任务就落在java.exe身上。Java.exe的工作就是找到合适的JRE来运行Java程序。 Java.exe依照底下的顺序来查找JRE:自己的目录下有没有JRE;父目录有没有JRE;查询注册表: [HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment] 所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。
3、介绍JVM JRE目录下的Bin目录有两个目录:server与client。这就是真正的jvm.dll所在。 jvm.dll无法单独工作,当jvm.dll启动后,会使用explicit的方法(就是使用Win32 API之中的LoadLibrary()与GetProcAddress()来载入辅助用的动态链接库),而这些辅助用的动态链接库(.dll)都必须位于jvm.dll所在目录的父目录之中。因此想使用哪个JVM,只需要设置PATH,指向JRE所在目录底下的jvm.dll。