2007年12月9日
#
Java Swing 學(xué)習(xí)
java.awt.Graphics是繪制圖形的重要類。它提供最底層的線,圓和矩形等的繪制。繪制圖形和填充圖形在坐標(biāo)和像素的設(shè)置上是有個(gè)很小的區(qū)別。繪制時(shí),實(shí)際所得的像素要比坐標(biāo)從右邊和下邊多出一行,所以設(shè)置時(shí)坐標(biāo)應(yīng)該是這樣:g.drawRect(0,0,size.width-1,size.height-1);填充時(shí),只在所繪制的坐標(biāo)岡,所以直譯時(shí)應(yīng)該是這樣:g.fillRect(0,0,size.width,size.height)。這樣繪制和填充好的圖形才對(duì)。雖然現(xiàn)在還用不著這些技術(shù),但是對(duì)于更深刻的了解AWT和Swing提供了基礎(chǔ)。
當(dāng)框架和監(jiān)聽器不寫在同一個(gè)類的時(shí)候,會(huì)出現(xiàn)在監(jiān)聽器類中難以訪問框架類中swing組件。目前我認(rèn)為是不同的實(shí)例化對(duì)象的組件也不同,所以要在監(jiān)聽器類中訪問框架類中的組件,可用以下兩種方法:
1:利用組件的的setActionCommand和監(jiān)聽器類中的getActionCommand方法來使框架中的組件在監(jiān)聽器類中得以識(shí)別。但這種方法有局限性。
2:利用監(jiān)聽器類中一個(gè)構(gòu)造方法傳遞框架類。
public MyActionListener(JFrame jframe){
this.jFrame=jframe;
}
這樣,在監(jiān)聽器類中可以像一般變量那樣調(diào)用組件。
java中equals方法與==邏輯運(yùn)算符
在Java中,我們比較兩個(gè)對(duì)象時(shí)有兩種方法,一種是直接使用邏輯運(yùn)算符==號(hào),還有一種就是用equlas()函數(shù),該函數(shù)在Object中就定義了,所以每個(gè)類都會(huì)有這個(gè)函數(shù),好了現(xiàn)在我們看看普通對(duì)象和字符串在使用這兩種比較方式有什么不同,看下面代碼,讀者可以猜猜看結(jié)果是什么:
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
為什么會(huì)出現(xiàn)上面的結(jié)果呢,其實(shí)在Java中,邏輯運(yùn)算符==號(hào)在比較對(duì)象的時(shí)候是嚴(yán)格的比較這兩個(gè)對(duì)象是不是同一個(gè)對(duì)象,說白了,它比較的是兩個(gè)對(duì)象在內(nèi)存中的地址,只有當(dāng)兩個(gè)變量指向同一個(gè)內(nèi)存地址即同一個(gè)對(duì)象時(shí)才返回true,否則返回false,所以就可以看到當(dāng)我們用new方法創(chuàng)建了o1和o2由于分配了兩個(gè)不同的內(nèi)存空間,所以它們?cè)谟眠壿嬤\(yùn)算符==號(hào)來判斷兩個(gè)對(duì)象是否相等時(shí)自然應(yīng)該返回的是false,而在比較o1和o3時(shí),由于o3指向的實(shí)際是o1所指向的地址,所以返回true,在字符串中邏輯運(yùn)算符==的作用和普通對(duì)象是一樣的。
那么對(duì)于o1和o2用equals()方法比較返回的為什么也是false呢,我們來看一段代碼:
public boolean equals( Object o2 )
{
this == o2;
}
這是Object中equals()函數(shù)的實(shí)現(xiàn),可以看到實(shí)際上它的功能還是比較兩個(gè)對(duì)象的地址,自然你現(xiàn)在可以推出為什么o1和o2比較時(shí)還是返回false了。
那現(xiàn)在問題可能來了,那為什么s1和s2比較時(shí)返回的是true呢,他們?cè)趦?nèi)存空間的地址可是不一樣的啊,呵呵,其實(shí)這個(gè)理解起來更簡(jiǎn)單了,因?yàn)樵赟tring類中重載了equals()函數(shù),使它比較的是兩個(gè)字符串的內(nèi)容,而不是兩個(gè)字符串對(duì)象在內(nèi)存中的地址,至于如何寫這個(gè)函數(shù)我就不多說了,大家可以自己寫寫看,實(shí)現(xiàn)方式有多種,不過Sun公司當(dāng)然只有那一種實(shí)現(xiàn)方式,哈哈
JAR,標(biāo)準(zhǔn)輸入輸出,文件輸入輸出
今天軟件終于做出來了,用JAR打包,打了十幾次都沒打成功。在網(wǎng)上找了
一個(gè)多鐘頭才找到了問題的所在,竟然是一個(gè)回車,以下是MANIFEST.MF文件的內(nèi)
容:
Manifest-Version: 1.0
Created-By: 1.5.0_06 (Sun Microsystems Inc.)
Main-Class: StuLogon
在含有Main方法的類StuLogon后邊一定要加上回車,讓光標(biāo)到下一行。就這么個(gè)
問題浪費(fèi)了我一個(gè)鐘頭時(shí)間。
標(biāo)準(zhǔn)輸入輸出
從鍵盤輸入(讀)到內(nèi)存,再從內(nèi)存輸出(寫)到顯示器
文件輸入輸出
從人輸出(寫)到文件,再從文件輸入(讀)到內(nèi)存,再從內(nèi)存輸出(寫)到顯
示器
jdk與jre的區(qū)別
對(duì)于java初學(xué)者來說,往往不懂區(qū)分jdk和jre的區(qū)別,實(shí)際上這兩個(gè)東西差別很大的,有必要了解一下:
簡(jiǎn)單的說JDK是面向開發(fā)人員使用的SDK,它提供了Java的開發(fā)環(huán)境和運(yùn)行環(huán)境。SDK是Software Development Kit 一般指軟件開發(fā)包,可以包括函數(shù)庫、編譯程序等。
JDK就是Java Development Kit
JRE是Java Runtime Enviroment是指Java的運(yùn)行環(huán)境,是面向Java程序的使用者,而不是開發(fā)者。
如果安裝了JDK,會(huì)發(fā)同你的電腦有兩套JRE,一套位于 /jre 另外一套位于 C:/Program Files/Java/j2re1.4.1_01 目錄下,后面這套比前面那套少了Server端的Java虛擬機(jī),不過直接將前面那套的Server端Java虛擬機(jī)復(fù)制過來就行了。而且在安裝JDK可以選擇是否安裝這個(gè)位于 C:/Program Files/Jav a 目錄下的JRE。如果你只安裝JRE,而不是JDK,那么只會(huì)在 C:/Program Files/Java 目錄下安裝唯一的一套JRE。
JRE的地位就象一臺(tái)PC機(jī)一樣,我們寫好的Win32應(yīng)用程序需要操作系統(tǒng)幫我們運(yùn)行,同樣的,我們編寫的Java程序也必須要JRE才能運(yùn)行。所以當(dāng)你裝完JDK后,如果分別在硬盤上的兩個(gè)不同地方安裝了兩套JRE,那么你可以想象你的電腦有兩臺(tái)虛擬的Java PC機(jī),都具有運(yùn)行Java程序的功能。所以我們可以說,只要你的電腦安裝了JRE,就可以正確運(yùn)行Jav a應(yīng)用程序。
1、為什么Sun要讓JDK安裝兩套相同的JRE?這是因?yàn)镴DK里面有很多用Java所編寫的開發(fā)工具(如javac.exe、jar.exe等),而且都放置在 /lib/tools.jar 里。從下面例子可以看出,先將tools.jar改名為tools1.jar,然后運(yùn)行javac.exe,顯示如下結(jié)果: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 這個(gè)意思是說,你輸入javac.exe與輸入 java -cp c:/jdk/lib/tools.jar com.sun.tools.javac.Main 是一樣的,會(huì)得到相同的結(jié)果。從這里我們可以證明javac.exe只是一個(gè)包裝器(Wrapper),而制作的目的是為了讓開發(fā)者免于輸入太長(zhǎng)的指命。而且可以發(fā)現(xiàn)/lib目錄下的程序都很小,不大于2 9K,從這里我們可以得出一個(gè)結(jié)論。就是JDK里的工具幾乎是用Java所編寫,所以也是Java應(yīng)用程序,因此要使用JDK所附的工具來開發(fā)Java程序,也必須要自行附一套JRE才行,所以位于C:/Program Files/Java目錄下的那套JRE就是用來運(yùn)行一般Java程序用的。
2、如果一臺(tái)電腦安裝兩套以上的JRE,誰來決定呢?這個(gè)重大任務(wù)就落在java.exe身上。Java.exe的工作就是找到合適的JRE來運(yùn)行Java程序。 Java.exe依照底下的順序來查找JRE:自己的目錄下有沒有JRE;父目錄有沒有JRE;查詢注冊(cè)表: [HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment] 所以java.exe的運(yùn)行結(jié)果與你的電腦里面哪個(gè)JRE被執(zhí)行有很大的關(guān)系。
3、介紹JVM JRE目錄下的Bin目錄有兩個(gè)目錄:server與client。這就是真正的jvm.dll所在。 jvm.dll無法單獨(dú)工作,當(dāng)jvm.dll啟動(dòng)后,會(huì)使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來載入輔助用的動(dòng)態(tài)鏈接庫),而這些輔助用的動(dòng)態(tài)鏈接庫(.dll)都必須位于jvm.dll所在目錄的父目錄之中。因此想使用哪個(gè)JVM,只需要設(shè)置PATH,指向JRE所在目錄底下的jvm.dll。