Java學習筆記2
Java語言簡介
- 源程序,字節碼程序
- .class文件
- 垃圾回收 機制
Java運行環境 JRE - Java SE(J2SE)
- EE ME
- JVM 加載、校驗、執行
常用命令
-
Javac:編譯器
-
java:
-
反匯編:javap
-
可讀性第一,效率第二
-
Java application
-
Java applet
-
netbeans IDE
-
NULL 不是關鍵字
-
finally 是關鍵字
-
$開頭為合法標志符
-
基本數據類型
| 命令 | 作用 | 備注 |
|---|---|---|
| 成員變量 | 可以不初始化 | |
| 局部變量 | 必須初始化 |
包裝器類
-
Java每種數據類型都有一個包裝器類,對于xxx類:
- valueOf(String str):返回指定String值的xxx對象
- xxxValue:返回xxx對象
-
byte、char、short數據之間的運算結果是int
-
自增符不能用于表達式

-
定義成員方法的語法格式:
權限修飾符 返回值類型 方法名(參數類型 參數名){}
2 數據類型
3 運算符和表達式
4 流程控制
5 Java的繼承、多態、高級類特性和數組
5.2 繼承與多態
Food mlt = new MaLaTang();
- 聲明類型 Food
- 實際類型 MaLaTang
- 調用的方法在子類和父類中都有,那么最終的方法調用以實際類型為準
- 如果聲明類型與實際類型不一樣,且調用的方法是實際方法獨有的,那么該方法不能調用。
5.3.3 枚舉類型
public enum Season
{
a,b,c,d;
}
5.3.4 抽象類
abstract class A
- 抽象類不可以實例化對象
- 抽象類必須被繼承,與final類相反
- 可以定義一個統一的編程接口LLLL
- 抽象類定義所有子類共用的抽象方法,實現細節由子類完成
- 抽象類可以繼承抽象類,普通類可以繼承抽象類;抽象類可以繼承普通類;
- 普通類可以繼承接口,
- 接口可以繼承接口(通過extends),但不可以繼承抽象類
5.3.5 接口
- Java不支持多繼承
接口與抽象類的區別
- 抽象類中可以有具體方法,接口必須全部為抽象方法
- 抽象類中的方法可以使用多種修飾符來修飾,接口中的方法必須通public abstract來修飾
- 抽象類中的屬性可以使用多種修飾符來修飾,接口中???方法必須通public static final來修飾
接口的聲明
- [修飾符] interface In1 [extends 父接口名]
- 接口只能包含常量定義和抽象方法定義
- 接口體內只包含常量定義和抽象方法定義兩部分。
接口的實現
- class A implements In1, In2
- 0 or all: 所有方法都要實現
- 接口中聲明方法可省略public和abstract,但在實現的時候,要有public修飾
接口作為類型的使用
接口與abstract類的比較
- 接口中只能有常量,只能有abstract方法
5.4 內部類
- 內部類不能聲明靜態變量和靜態方法
- 外部類可以用內部類聲明對象
- 聲明方法:直接聲明、new
- 內部類不能與外部類同名
- 內部類可以作為其他類的成員
5.5 數組
- 數據類型相同
- 數組是引用類型,java中的數組屬于對象的成員變量
5.5.1 一維數組
- 聲明+初始化
int[] Arr = new int[100] //默認的元素全部為0
int[] Arr = {1,2,3}
5.5.2 二維數組
- 二維數組每一行的長度可以不一樣
//從高維向低維依次進行空間分配
int [][] c = new int[3][];
c[0] = new int[4];
c[1] = new int[5];
c[2] = new int[6];
數組的復制
- java.lang.System類提供了靜態方法arraycopy()
static void arraycopy(Object src, int srcPos, Obj dest, int destPos, int length)
6 異常和斷言
6.1 異常概述
- Throwable直接繼承自object,所有異常必須是Throwable類的實例或其子類
- Throwable派生Error和Exception類
- Exception派生RuntimeException
- Throwable的常用方法:
- getMessage()
- getStackTrace() //返回堆棧跟蹤情況
- printStackTrace() // 打印堆棧的標準錯誤流
- fillStackTrace()
- toString() //返回簡單描述
- throw一個異常:生成一個異常對象并把它提交給運行時系統的過程
- catch一個異常:運行時系統從生成異常的方法開始回溯,直到找到包含相應異常處理的方法
6.2 異常的處理
try{
...//被監視的代碼段
}
catch(異常類型 e){ ... //異常處理語句}
catch(){}
finally{} //最終處理
- 異常總是在方法內產生
拋出異常
- 一個方法可以聲明拋出多個異常
- 若一個方法產生了異常,而不處理異常,則可以在方法聲明時,用throws拋出異常,傳遞給其調用者或更高一級的調用者,直到被捕獲。
doSomething() throws IOException{...}
method1() throws IOException{...}
method2() throws IOException{...}
public Static main(){
try{
method2();
}catch(IOExcetption e){...}
}
自定義異常
class 自定義異常名 extends Exception{
...
}
throw new 異常類名();
程序會在throw語句處立即終止,轉向try...catch尋找異常處理方法,不再執行throw之后的語句
finally語句
- finally語句總是在return之前執行
6.3 斷言
assert (布爾表達式)
assert (布爾表達式):"表達式"
-
布爾表達式為假則拋出AssertionError,在第二種形式中,表達式會作為參數傳進AssertionError的構造方法中以消息字符串
-
斷言主要用于程序開發和測試階段
-
對某個包或類打開斷言
java -ea:com.mydx.mylib... -
對某個包或類關閉斷言
java -da:com.mydx.mylib... -
系統級打開斷言
-esa -
系統級關閉斷言
-dsa
7 輸入輸出及文件操作
7.1 流的概念
- java.io和java.lang處理輸入輸出
標準的I/O流
-
鍵盤:stdin
-
監視器:stdout
-
stdin和stdout均被封裝在System類的類變量in和out中
-
每當main方法被執行,就自動生成下述三個類的對象:
- System.in: extends InputStream
- System.out: extends PrintStream
- System.err: extends PrintStream
-
java.io包有字節流和字符流
-
字節流extends InputStream或OutputStream
-
字符流extends Reader和Writer
7.2 文件
- File是io包中的非流類
- 目錄也作為文件對象處理
- File的構造方法
File(String filename);
File(String directoryPath, String filename);
File(File f, String filename);
try{f.createNewFile();}
catch(Exception){...}
- 常用方法
* f.delete() //文件刪除
* public String getName() //獲取文件名
* public long lastModified() //獲取文件最后被修改時間
* public boolean canRead() //判斷是否可讀
* public boolean canWrite() //判斷文件是否可寫
* public boolean isDirectory() //判斷是否為目錄
目錄
- 創建目錄:
public boolean mkdir()
File f = new File("f:\\java");
f.mkdir();
- 列出目錄中的文件
public String[] list()
public String[] list(FilenameFilter obj)
public File[] listFile()
public File[] listFile(FilenameFilter obj)
隨機文件流
- RandomAccessFile類可同時完成讀和寫
public class RandomAccessFile extends Object implements DataInput, DataOutput
-
DataInput方法:readBoolean()、readInt()、readLine()
-
DataOutput方法: writeChar()、writeDouble()、write()
-
RandomAccessFile類僅限操作文件,不能訪問其他IO設備(網絡、內存映像)
-
RandomAccessFile類有個文件指針,剛打開文件時,文件指針指向開頭,可以移動文件指針到新的位置,以此位置開始讀寫操作。
-
RandomAccessFile常用方法
byte readByte() //讀取一個字節
double readDouble()
int readInt()
String readLine()
void write(byte b[])
void writeDouble(double v)
void seek(long pos) // 將指針指向pos指定的位置
void close()
void length()
long getFilePointer()
void setLength(long newLength)
-
RandomAccessFile常用方法都會拋出IOException異常,需要放入try...catch結構中
-
創建隨機文件流
File f = new File("file.txt")
new RandomAccessFile(f, "rw");
new RandomAccessFile("file.txt", "w");
raf1.write(name.getBytes()); //將String類型的name變為字節數組
raf1.writeInt(age);
raf1.close;
7.3 字節流
- 字節流extends InputStream或OutputStream,兩個都是抽象類
- InputStream和OutputStream的所有方法在出錯的時候都會拋出IOException異常
InputStream
- 常用方法
read()
skip() //跳過指定數量的字節不讀
available() //返回流中可用字節數
mark() // 在流中的當前位置做一個標記
reset() //返回上一個標記位置
markSupport()
close()
- read()的三種用法,若返回值為-1,表明流結束
int read()
int read(byte b[])
int read(byte b[], int off, int len) //從輸入流中讀取長度為len的數據,寫入數組b中從索引off開始的位置,并返回讀取的字節數
OutputStream
- 常用方法
void write(int b)
void write(byte b[])
void write(byte b[], int off, int len)
void flush() // 刷空輸出流,并將緩沖區中的數據強制送出
void close()
數據流
-
數據流類可處理字節和字節數組,還可以實現對文件不同數據類型(int、float、Boolean)的讀寫
-
DataInputStream和DataOutputStream分別實現了接口DataInput和DataOutput
-
常用方法:
readInt()
writeInt()
readByte()
writeByte()
readBoolean()
readChar()
readLine()
- 構造方法:
DataInputStream(InputStream in)
DataOutputStream(OutputStream out)
文件流
FileInputStream
- 構造方法:
FileInputStream f0 = new FileInputStream("/a.txt");
File f = new File("/a.txt");
FileInputStream f1 = new FileInputStream(f);
FileOutputStream
FileOutputStream(String filepath, boolean append) //附加還是覆蓋
- FileOutputStream類的對象創建不依賴于文件是否存在,沒有就創建
- FileNotFoundException異常:無法創建、打開時拋出
- 利用數據流向文件中寫數據
int[] myArr = {1,2,3}
DataOutputStream doc = new DataOutputStream(new FileOutputStream("ints.dat"))
for ()
dos.writeInt(myArray[i])
內存的讀寫
ByteArrayInputStream
- 構造方法
ByteArrayInputStream(byte [] buf)
ByteArrayInputStream(byte b[], int off, int len)
- 自有方法
public byte[] toByteArray()
public int size() //返回緩沖區大小
ByteArrayOutputStream
字符流
FileReader
FileWriter
- FileWriter打開一個只讀文件,引發IOException
緩沖流
- BufferedReader和BufferedWriter類
BufferedReader
- 構造方法
BufferedReader(Reader in)
BufferedWriter
- 構造方法
BuffeiwedWriter(Writer out, int bufSize)
Scanner類
- java.lang包的System類有in和out
Scanner reader = new Scanner(System.in)
之后調用reader的各種方法,實現讀取用戶在命令行輸入的各種數據
7.5 對象流
ObjectInputStream和ObjectOutputStream類
- 構造方法
ObjectInputStream(InputStream in) - 實現了接口ObjectXput,是XputStream的子類
- 通常用FileXputStream對象作為參數創建ObjectXputStream對象,之后用readObject()/writeObject()方法
- readObject()返回類型為Object
可串行化
- java中,只有可串行化的對象才能通過對象流進行傳輸
- 只有實現了Serializable接口的類才能被串行化
- Serializable接口不包含任何方法
7.6 過濾流
字符過濾流
- 其他過濾流都是FilterReader/FilterWriter的子類
- FilterReader/FilterWriter都被定義為abstract,但它們沒有抽象方法。abstract的作用是強制二者不能被實例化,必須被繼承,
7.7 管道
- 連接方法:
- 構造
- connect
7.8 不同流的速度比較
- 內存映射>緩沖>文件>RandomAccessFile
Java I/O流的其它應用
8 線程
8.1 線程的概念
- 進程是程序的一次動態執行過程
- 標準線程是由指令指針(PC),線程ID,寄存器集合和堆棧組成
- 線程間的數據可以共享
線程模型
- 三個部分組成:虛擬cpu、code、Data
- 虛擬cpu封裝在java.lang.Thread類中
8.2 線程的創建
- 以下兩種方法都要使用Java.lang中的Thread類及其方法:
- 由Thread類派生子類
- 實現Runnable接口
- 生成一個Thread對象,就產生了一個線程,對該對象進行操作,就操作了該線程
- Thread類本身只是線程的虛擬CPU,線程所執行的代碼是通過方法Run()來完成的
- Run()方法稱為線程體,當一個線程被建立并初始化以后,Java的運行時系統就會調用run()方法。
通過繼承Thread類構造線程
class testThread extends Thread{
public testThread (){
super(str); //調用父類的構造方法為線程對象命名
}
public void run(){
for (int i=0; i<3; i++){
System.out.println( getName()+"在運行"); //將值輸出顯示在console窗口中
try {
sleep(1000);
System.out.println( getName()+"在休眠");
} catch(InterruptedException e){}
}
System.out.println( getName()+"已結束")
}
}
class Thread1{
public static void main(String args[]){
testThread t1 = new testThread("Thread1");
testThread t2 = new testThread("Thread2");
t1.start();
t2.start();
}
}
通過實現Runnable接口構造線程
- 一個類已經擴展了Frame和Applet,由于單繼承性,這樣的類就不能再繼承Thread,可以通過實現Runnable接口構造線程
class class1 implements Runnable
{
someMethod{
//以實現了Runnable接口的類創建的對象 為參數 來創建Thread對象
Thread threadobj = new Thread(new class1())
threadobj.start()
}
public void run(){
...
}
}
public static void main(String args[]){
Thread threadobj = new Thread( new class1);
threadobj.start();
}
- run()方法的返回值類型應為void
- Java.util包有一個Date類,實例化Date對象可得到當前事件
8.3 線程的調度與控制
線程的優先級
-
Thread類有三個關優先級的靜態常量
- MIN_PRIORITY=1
- MAX_PRIORITY=10
- NORM_PRIORITY=5
-
新線程會繼承創建它的父類的優先級
-
線程具有普通優先級
-
setPriority()修改優先級
線程的基本控制
sleep()
- sleep()會拋出InterruptedException,必須捕獲
yield()
- 將執行的權利交給其他優先級相同的線程
- 若隊列中沒有其他線程,則繼續執行
join()
- 使當前的線程等待,直到t結束為止
- 當前線程調用t.join(),則當前線程等待線程t結束后繼續執行
- join(long millis):調用t.join(),當前線程等待線程t結束或最多等待millis毫秒
interrupt()
currentThread()
isAlive()
- 如果線程已被啟動且未被終止,那么isAlive()返回true,但無法判斷是處于可運行還是等待狀態
- 如果返回false,則線程是新創建或已被終止
suspend()和resume()
- 易造成死鎖
8.4 線程的同步
2 對象鎖及其操作
- 實現對象互斥鎖:synchronized:用于方法或代碼段
- 一個對象中所有synchronized方法都共享一把鎖
- 聲明方法:
synchronized returnType methodName([paraList]){}
synchronized (this) {}
- 如果synchronized用在類聲明中,則表明該類中的所有方法都是synchronized
3 線程間的交互
- wait()、notify()/notifyAll()都是Object類的final方法,被所有類繼承,不可被改寫
- 三者只能在被聲明為synchronized的方法或代碼段中使用
wait()
- 讓當前線程釋放其所持有的“對象互斥鎖”,進入wait隊列
notify()
- 喚醒一個或所有正在等待隊列中等待的線程,并將他們移入等待同一個“對象互斥鎖”隊列
- notify后,當前線程不會馬上釋放鎖,要等到當前線程被synchronized修飾的代碼執行完,才會釋放鎖
8.5 線程的狀態
- Newborn 之后一定是 Runnable
- Running 之前一定是 Runnable
- Dead之前一定是Running
Newborn
- 創建一個新線程后,該線程為New狀態,系統不為它分配資源
- 該狀態只能調用start()或stop(),否則拋出IllegalThreadStateException
- 調用start()后,該線程參與運行調度
Runnable
- New -> start() -> 系統分配資源 -> run() -> Runnable
- Running -> yield() -> Runnable
- Running -> sleep()/t.join 結束 -> Runnable
- Running -> 調用wait(),被notify()/Allnotify()喚醒(注意不能是sleep(),且必須被喚醒) -> Runnable
- Blocked -> 輸入輸出結束 -> Runnable
Running
- Runnable -> 獲取CPU -> Running
Blocked
- Running -> Blocked
- 線程調用sleep()、join()、wait()
- 線程中使用synchronized來請求對象的鎖而未獲得
- 線程進行輸入輸出
Dead
- Running -> run()正常結束 -> Dead
- stop()
8.6 線程相關的其他類與方法
8.6.1 支持線程的類
- java.lang.Thread
- java.lang.Runnable
- java.lang.Object
- java.lang.ThreadGroup
- java.lang.ThreadDeath
8.6.2 線程組
- 線程組在線程創建時設置,不可改變
- 使一組線程作為一個對象進行統一處理與維護
8.6.3 Thread類的其他方法
public final void setName(String name)
public final String getName()
public static int activeCount()
public final ThreadGroup getThreadGroup() //返回該線程所屬的線程組
public final void setDaemon() //設置守護線程
public String toString() //返回該線程的字符串表示形式
public static int enumerate(Thread[] tarry)
9 編寫圖形用戶界面
- AWT:abstract window toolkit 抽象窗口工具包
- AWT可用于Java的Application和Applet
- Swing組件:建立在AWT之上
9.1 用AWT編寫GUI
- 創建圖形界面的基礎包:java.awt
9.1.1 基本的GUI類
Component類
- 基本方法
setName
getName //獲取標題
paint
repaint
update
setFont
setForeground
setSize
setLocation
setEnable
isEnable
setVisible
- 常用組件
- Button
- CheckBox
- Choice
- Label
- Canvas
Container類
-
Container類是Component類的子類
-
用來表示各種GUI組件的容器
-
主要方法
- 管理組件
add()
remove()
- 布局管理
setLayout()
9.1.2 常用容器
Frame 窗口
- 包含標題、菜單、文本區和按鈕的圖形窗口
- Frame extends Window
- Window extends Container
Panel
- 透明容器,沒有標題和邊框
- 不能作為最外層的容器單獨存在
- 面板可以享有自己的布局管理器
- 可以使用一個布局管理器組合不同的面板,并放于一個Frame或Applet或其他面板中
9.1.3 布局管理器 LayoutManager
-
在不同的操作系統中,Java構件外觀可能不同,JVM獲取不同操作系統的標準按鈕。布局管理器可以管理版面布局
-
可以使用實現了LayoutManager接口的布局類來設置組件的布局方式。
-
布局管理器都實現了LayoutManager接口
-
使用布局管理器后,無法繞過它設置組件的大小、位置(調用setLocation()、setSize()等),若要自己設置,則需取消該容器的布局管理器(setLayout(null))
-
不同的容器有不同的默認布局管理器
-
FlowLayout是Pane和Applet的默認布局管理器
-
BorderLayout是Window、Dialog和Frame的默認布局管理器
FlowLayout
- 自動調用組件的getPreferedSize()方法
- 容器改變大小后,各組件大小不變,相對位置變化
- 添加組件:add()
- 若原容器不使用FlowLayout,而要修改為使用FlowLayout:
setLayout(new FlowLayout())
- setLayout是Container的方法
BorderLayout
- 東西南北
- 容器改變大小后,相對位置變化,組件大小改變:南北組件高度不變,東西組件寬度不變
- 添加組件方法
add("West", new Button("West"));
add(new Button("West"), BorderLayout.SOUT);
GridLayout
- 要在網格單元中放多個組件要先在此網格單元中放容器
CardLayout
- 使用CardLayout布局時,調用
add(字符串,組件)將組件加入容器 - 顯示組件:
show(容器名, 字符串)
first(容器名)
last(容器名)
previous()
next()
容器的嵌套
public class TestPanel extends Frame{
Panel p1;
TextArea ta;
TextField tf;
Button bt;
Label lb;
public TestPanel{
super("容器嵌套");
p1 = new Panel();
p1.setBackground(Color.gray);
ta = new TextArea();
tf = new TextField("textfieldtext");
bt = new Button("buttonton");
lb = new Label("labelabel")
p1.add(bt);
p1.add(ta);
p1.add(tf);
p1.add(bt);
p1.add(lb);
add(p1,"East");
setVisible(true);
setSize(360,240);
}
}
## 9.2 AWT事件處理模型
* 三類對象:Event、Event Source、Event Handler
* Button類的方法
```java
public void setLabee(String label)
public void addActionListener(ActionListener l)
public void removeActionListener(ActionListener l)
Button Event 處理步驟
- 通知JVM類要監督和處理一個動作事件
- 激活按鈕
- 實現一個方法處理事件
ActionListener
-
java.awt.event包的一個接口
-
只有一個方法
public interface ActionListener extends EventListener{
public abstract void actionPerformed(ActionEvent e)
}
- 關鍵步驟:
public class EventFrame extends Frame{
private Button quit = new Button("Quit")
public EventFrame(){
...
setLayout(new FlowLayout());
add(quit);
//quit是事件源,產生事件而不處理事件,ActionListener處理事件
...
quit.addActionListener(new ButtonHandler());
//注冊按鈕給監聽者
}
}
//指定按鍵之后的行動
class ButtonHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}
- 把按鈕對象注冊給實現了監聽器接口的對象
事件類
- 所有事件都放在包java.awt.event中
- java.util.EventObject是所有事件類的父類,有兩個主要方法:
getSource() //獲取事件源
toString() //返回事件對象名的字符串
- java.awt.event中常見的事件類:
- 低級事件
- ComponentEvent
- FocusEvent
- KeyEvent
- MouseEvent
- WindowEvent
- 高級事件
- ActionEvent
- AdjustmentEvent
- ItemEvent
- TextEvent
- 低級事件
事件監聽器
- 事件監聽器在java.awt.event包中,被定義為接口
- 事件監聽器與事件要對應起來
- 常見的事件監聽器
- ActionListener
- AdjustmentListener
- ComponentListener
- 鼠標事件的監聽器
- MouseListener
- MousMotionListener
AWT事件及其相應的監聽器接口
ActionEvent事件
- 觸發時機
- 單擊按鈕
- 點擊菜單項
- 文本框中按回車
- 事件監聽接口:ActionListener
- 用匿名類創建接口對象:
ActionListener listener = new ActionListener(){ public void actionPerformed(ActionEvent event){ ... } }
- 用匿名類創建接口對象:
- 接口方法:actionPerformed(ActionEvent e)
- 組件注冊該事件的方法:addActionListener()
Window事件
- WindowListener接口方法:
- windowActivated(WindowEvent e)
- windowClosed(WindowEvent e)
- windowDeiconified(WinowEvent e) 從最小化恢復為普通窗口
- windowIconified(WindowEvent e) 窗口變為最小化圖標
- 接口適配器類
- 當接口方法不止一個時,只實現其中一部分
- WindowAdapter
ComponentEvent事件
- 觸發時機
- 組件移動
ContainerEvent事件
FocusEvent事件
ItemEvent事件
- 觸發時機
- 改變復選框中選中狀態
- 接口方法
TextEvent事件
- 觸發時機
- TextField中按下Return鍵
- 接口方法:textValueChanged(TextEvent e )
KeyEvent事件
- KeyEvent方法:
- char getKeyChar()
- int getKerCode()
- 接口方法:
- keyPressed(KeyEvent e)
- keyReleased(KeyEvent e)
- keyTyped(KeyEvent e)
MouseEvent
MouseListener
MouseMotionListener
- 接口方法:
- mouseMoved(MouseEvent e)
- mouseDragged(MouseEvent e)
9.2.4 事件適配器類
適配器類 Adapter
- Adapter可以作為事件監聽器的父類
內部類
- 內部類對象可以訪問外部類的成員方法和變量,包括私有成員
- 內部類、匿名類編程易于實現事件監聽器
- 內部類便于編寫事件驅動程序
匿名類
- 用于“次拋”
- 構造方法
someMethod( new ClassType([constructorInputList]){類體} )
- 以接口名作為構造方法名稱,創建的就是匿名類
9.3 AWT組件庫
常用的基本組件
CheckBox 復選框
復選框組
下拉式菜單(choice)
畫布
單行文本輸入區(TextField)
文本輸入區(TextAera)
列表
Dialog
FileDialog
用戶
MenuItem
Menu
- 菜單只能被添加到MenuBar中
MenuBar
- MenuBar只能???添加到Frame中
Color
- Java.awt.Color類提供了顏色的一些方法
Font
- Java.awt.Font類提供了字體
Font myFont = new Font(String name, int style, int size)
9.4 用Swing編寫GUI
Swing概述
- javax.swing包中4個重要類:JApplet、JFrame、JDialog和JComponent
- JComponent是絕大部分組件的父類
-
JFrame, JApplet, JDialog, JWindow都是重組件,有同位體,可以和操作系統交互信息,稱為Swing的頂層容器
-
javax.swing.event包中定義了事件和事件監聽器類。
-
javax.swing.table包中包括了表格組件的支持類。
Swing的特性
- 支持鍵盤代替鼠標
- 使用圖標
9.5 Swing組件和容器
組件的分類
- 頂層容器:JFrame, JApplet, JDialog, JWindow
- 中間容器:JPanel, JScrollPane, JSplitPane, JToolBar
- 特殊容器:JInternalFrame, JLayeredPane, JRootPane
- 基本組件
- JButton
- JComboBox
- JList
- JMenu
- 不可編輯的信息顯示
- Jlabel
- JProgressBar
- JToolTip
- 可編輯的信息顯示
- JFileChooser
- JTable
- JTextArea
使用Swing組件的基本規則
-
加組件不能直接添加到頂層容器之中,要加到與頂層容器相關的內容面板(content pane)上
-
避免使用非Swing的重量級組件
-
添加組件的兩種方式
//getContentPane()獲取JFrame的內容面板后再添加組件
frame.getContentPane().add(childComponent);
// 建立一個中間容器,把組件添加到容器中,用setContentPane方法把該容器置為JFrame的內容面板
JPanel contentPane = new JPanel();
frame.setContentPane(contentPane);
各種容器面板
根面板
- 由以下3個部分組成
- GlassPane:玻璃面板,完全透明,默認不可見,用于接收鼠標事件和在組件上繪圖
- ContentPane:
- JMenuBar:可選擇菜單條
- 常用方法:
Container getContentPane();
JMenuBar getMenuBar();
Component getGlassPane();
JLayeredPane getLayeredPane();
分層面板
- Swing提供兩種分層面板:JLayeredPane和JDesktopPane,
- JDesktopPane是JLayeredPane的子類,用以容納內部框架
JPanel
- 是中間容器,是輕量組件
- 默認布局是FlowLayout
JScrollPane
JSplitPane
JTabbedPane
JToolBar
JInternalFrame
- 需添加到一個容器中(通常為JDesktopPane),否則不顯示
- 不必調用show()或setVisible()方法,內部框架隨所在容器一起顯示
- 必須用setSize()或pack()或setBounds方法設置尺寸
- setLocation()或setBounds設置其在容器中的位置
- 像頂層JFrame一樣,對內部框架添加組件也要加到它的內容面板上
- 在內部框架中建立對話框,不能使用JDialog作為頂層窗口,要用JOptionPane或JInternalFrame
- JInternalFrame不能監聽窗口事件,但可監聽JInternalFrameEvent
各種組件
JButton
- 構造方法
JButton(String text, Icon icon)
JCheckBox
JRadioButton
JComboBox
JProgresBar
JTable
JTree
JOptionPane類
-
showXXXDialog()方法所用參數:
- parentComponent:指示對話框的父窗口對象
- message:
- title
- messageType:
- ERROR_MESSAGE
- PLAIN_MESSAGE
- icon
- optionType
- DEFAULT_OPTION
- YES_NO_OPTION
- initialSelectionValue
String inputValue = JOptionPane.showInputDialog("Input something")
4. 布局管理器
- BoxLayout
事件處理
- 需要用到的兩個包:java.awt.event 和 java.swing.event
10 Applet
與Application的關系
-
Application使用命令行命令直接運行,從main()方法開始運行
-
Applicati的解釋器是java.exe,Applet的解釋器是兼容java的瀏覽器
-
Applet的主類要定義為Applet類或JApplet類的子類
-
Applet可以不包含main()方法
Applet工作原理
- 運行于瀏覽器環境
- 首先要創建一個HTML文件,通過編寫HTML語言代碼告訴瀏覽器載入何種Applet以及如何運行。
- 每個Applet必須是通過擴展Java的Applet類來實現
- 所有的Applet須繼承自Applet類
class AppletName extends Applet
- 瀏覽器(向WWW服務器)請求、下載、解釋、顯示HTML
- 瀏覽器遇到HTML中的Applet標記,根據Applet的名字和位置請求、下載Applet字節碼文件(.Class)
- 瀏覽器用Java解釋器執行Applet
- 字節碼文件和HTML文件可以放在相同或不同的服務器上
Applet的生命周期
- 初始化:init()
- 開始運行:start()
- Applet的主體
- 停止運行:stop()
- 撤銷清理:destroy()
- 瀏覽器關閉時自動調用
- 清除Applet所用的所有資源
9.2 Applet的類層次結構
- Java.awt.Panel > Java.applet.Applet > Java.swing.JApplet
- 是一個面板容器
9.3 Applet類API
-
顯示方法
- paint(Graphics g)
- update(Graphics g)
- repaint()
-
HTML標記方法
- public URL getDocumentBase()
- public URL getCodeBase()
- public String getParameter(String name)
-
多媒體支持方法
- public image getImage(URL utl, String name)
- public AudioClip getAudioClip(URL utl, String name)
- public void play(URL utl, String name)
-
Applet信息報告方法
10.2 Applet的編寫
- import java.applet.*
- 如果基于Swing的Applet:
import javax.swing.*;
public class AppletName extends JApplet{}
在HTML中applet標記的使用
- 必要:applet, code, width, height
<applet code = "Hello.class" width = 300 height=300>
</applet>
- CODE
- WIDTH
- HEIGHT
- CODEBASE
- ALT
- NAME
使用標記參數向Applet傳遞信息
- PARAM NAME = appletParameter1 VALUE value
- Applet 可以用getParameter()獲取<PARAM>屬性指定的參數
- getParameterInfo()可得到有關<PARAM>屬性的說明信息
獲取參數步驟
- 在頁面中:
<param name=p1 value="11"> //name后不需加引號
- 在Applet類中
s1=getParameter("p1")
10.3 Applet與GUI
1. Applet中的事件處理
2. 基于AWT組件的Applet用戶界面
3. 基于Swing組件的Applet用戶界面
- 唯一子類:JRootPane 根面板
- JRootPane中的ContentPane是JApplet除了菜單條以外所有構件的父類
- 默認布局:BoarderLayout
- 繪圖方法:paintComponent()
4. JApplet添加構件方法
方法1
- 用getContentPane()方法獲得JApplet內容面板,再向內容面板中增加構件:
Container contentPane = getContentPane(); contentPane.add(SomeComponent)
方法2
- 建立一個JPanel之類的中間容器
- setContentPane(),將中間容器設為JApplet的內容面板
JPanel contentPane = new JPanel(); contentPane.add(SomeComponent); setContentPane(contentPane);
10.4 Applet的多媒體支持
- 顯示圖像
- getImage()
- 動畫
10.5 Applet與工作環境的通信
11 集合與泛型
11.1 集合的概念
- Collection,即Container
集合類的特點
- 只容納對象名
- 容納的元素都是Object類型
- 把一個對象置入集合類,它的類信息將消失
- 大小可變
- 解決數組定義數組時就要確認數組大小的問題
集合體系結構
- Java集合結構由兩個接口樹構成
- Collection
- 定義了所有集合的基本操作
- Set
- List
- Map
集合分類
Set
- 集里的對象不按任何特定的方式排列
- 按索引值操作數據
- 不能有重復的元素
List
- 按索引值操作數據
- 可以有重復的元素
Map
- 映射的每一項為“鍵——值對”,key不能重復,value可以重復
簡單集合類
Vector
- 實現動態數組
ArrayList
- 實現了List接口
以上為兩個動態數組
11.2 泛型
泛型類
class 類名 <T> {...}
浙公網安備 33010602011771號