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。