201711671125 《Java程式設計》第9周學習總結(第九、十章)
教材學習內容總結
第九章
1.處理事件
1.1事件處理模式
事件源:能夠產生事件的物件。
監視器:需要一個物件對事件源進行監視,以便對發生的事件做出處理。事件源通過呼叫相應的方法將某個物件註冊為自己的監視器。
addActionListener(監視器);
處理事件的介面:為了讓監視器這個物件能對事件源發生的事件進行處理,建立該監視器物件的類必須宣告實現相應的介面,即必須在類體中重寫介面中所有方法,那麼當事件源發生事件時,監視器就自動呼叫被類重寫的介面方法。
1.2ActionEvent事件
ActionEvent事件源
如果使用者選擇了某個單選按鈕,就會觸發ActionEvent事件。
註冊監視器
ActionEvent事件的元件使用方法addActionListener(ActionListener listen)將實現ActionListener介面的類的例項註冊為事件源的監視器。
ActionListener介面
該介面只有一個方法public void actionPerformed(ActionEvent e)。
ActionEvent類中的方法
Public Object getSource() 該方法是從Event繼承的方法,ActionEvent事件物件呼叫該方法可以獲取發生ActionEvent事件的事件源物件的引用。
Public String getActionCommand() ActionEvent物件呼叫該方法可以獲取發生ActionEvent事件時,和該事件相關的一個“命令”字串,對於文字框,當發生ActionEvent事件時,預設的“命令”字串是文字框中的文字。
1.4IteaEvent事件
ItemEvent事件源:選擇框、下拉列表都可以。選擇框提供兩種狀態,一種是選中,一種是未選中。
註冊監視器:能觸發ItemEvent事件的元件使用addItemListener(ItemListener listen)將實現ItemListener介面的類的例項註冊為事件源的監聽器。
ItemListener介面:只有一個方法public void itemStateChanged(ItemEvent e)。
ItemEvent事件物件出來可以使用getSource()方法返回發生ItemEvent事件的事件源外,也可以使用getItemSelectable()方法返回發生ItemEvent事件的事件源。
1.5DocumentEvent事件
DocumentEvent事件源:文字區含有一個實現DocumentE介面的例項,該例項被稱作文字區所維護的文件,文字區呼叫getDocument()方法返回所維護的文件。
Document類在javax.swing.event包中。只要使用者在文字區中進行文字編輯操作就會導致觸發DocumentEvent事件。
註冊監視器:事件源使用addDocumentListener(DocumentListener listen)將實現DocumentListener介面的類的例項註冊為事件源的監視器。
DocumentListener介面
在javax.swing.event包中,介面中有3個方法:
public void changedUpdate(DocumentEvent e)
public void removeUpdate(DocumentEvent e)
public void insertUpdate(DocumentEvent e)
1.6MouseEvent事件
任何元件上都可以發生滑鼠事件,導致MouseEvent類自動建立一個事件物件。事件源註冊監視器的方法是addMouseListener(MouseListener listener)。
使用MouseListener介面處理滑鼠事件
- 在事件源上按下滑鼠;
- 在事件源上釋放滑鼠;
- 在事件源上單擊滑鼠;
- 滑鼠進入事件源;
- 滑鼠退出事件源。
MouseEvent類幾個重要方法:
getX()獲取滑鼠指標在事件源座標系中的x座標。
getY()獲取滑鼠指標在事件源座標系中的y座標。
getModifiers()獲取滑鼠的左鍵(BUTON1_MASK)或右鍵(BUTTON3_MASK)。
getClickCount()獲取滑鼠被單擊的次數。
getSource()獲取發生滑鼠事件的事件源。
MouseListener介面中方法:
mousePressed(MouseEvent)負責處理在元件上按下滑鼠鍵觸發的滑鼠事件。
mouseReleased(MouseEvent)負責處理在元件上釋放滑鼠鍵觸發的滑鼠事件。
mouseEntered(MouseEvent)負責處理滑鼠進入元件觸發的滑鼠事件。
mouseExited(MouseEvent)負責處理滑鼠離開元件觸發的滑鼠事件。
mouseClicked(MouseEvent)負責處理在元件上單擊滑鼠鍵觸發的滑鼠事件。
使用MouseMotionListener介面處理滑鼠事件:
處理已下兩種操作:
在事件源上拖動滑鼠;
在事件源上移動滑鼠。
滑鼠事件的型別是MouseEvent,即當發生滑鼠事件時,MouseEvent類自動建立一個事件物件。
事件源註冊監視器的方法是addMouseMotionListener(MouseMotionListener listener)。
mouseDragged(MouseEvent)負責處理拖動滑鼠觸發的滑鼠事件。
mouseMoved(MouseEvent)負責處理移動滑鼠觸發的滑鼠事件。
1.7焦點事件
元件可以觸發焦點事件。可以使用addFocusListener(FocusListener listener)註冊焦點事件監視器。當元件獲得焦點監視器後,如果元件從無輸入焦點變成有輸入焦點或者從有輸入焦點變成無輸入焦點都會觸發FocusEvent事件。
從無輸入到有輸入:public void focusGained(FocusEvent e)
從有輸入到無輸入:public void focusLost(FocusEvent e)
一個元件也可呼叫public Boolean requestFocusInWindow()方法會的輸入焦點。
1.8鍵盤事件
當按下、釋放或敲擊鍵盤上一個鍵時就觸發了鍵盤事件。當一個元件處於啟用狀態時,敲擊鍵盤上一個鍵就會導致這個元件觸發鍵盤事件。
KeyListener介面的三個方法:
public void KeyPressed(KeyEvent e)(使用者按下某個鍵時)
public void KeyTyped(KeyEvent e)(是KeyPressed和KeyReleased的組合,當鍵被按下又釋放時呼叫)
public void KeyReleased(KeyEvent e)(使用者釋放某個鍵時)
KeyEvent類的public int getKeyCode()方法,可以判斷哪個鍵被按下、敲擊或釋放。public void getKeyChar()也可以判斷。getKeyChar()方法返回鍵上的字元。
1.9視窗事件
JFrame及子類建立的視窗可以呼叫setDefaultCloseOperation(int operation)
方法設定視窗的關閉方式。
WindowListener介面:
當一個視窗被啟用、撤銷激、開啟、關閉、圖示化或撤銷圖示化時,就觸發了視窗事件,即WindowEvent建立了一個視窗事件。
public void windowActivated(WindowEvent e)(當視窗從非啟用狀態到啟用時)
public void windowDeactivated(WindowEvent e)(當視窗啟用狀態到非啟用狀態時)
public void windowClosing(WindowEvent e)(當視窗正在被關閉時)
public void windowClosed(WindowEvent e)(當視窗關閉後)
public void windowIconified(WindowEvent e)(當視窗圖示化時)
public void windowDeiconified(WindowEvent e)(當視窗撤消圖示化時)
public void windowOpened(WindowEvent e) (當視窗開啟時)
WindowAdapter介面卡:介面卡可以代替介面來處理事件。
1.10匿名類例項或視窗做監視器
匿名類的例項做監視器:如果用內部類的例項做監視器,那麼當發生事件時,監視器就比較容易操作事件源所在的外嵌類中的成員。
視窗做監視器:能觸發事件的元件經常位於視窗中,如果讓元件所在的視窗作為監視器,能讓事件的處理比較方便。
2.使用MVC結構
模型-檢視-控制器(Model-View-Controller),簡稱為MVC,其目的是以會話形式提供方便的GUI支援。
模型:用於儲存資料的物件。
檢視:為模型提供資料顯示的物件。
控制器:處理使用者的互動操作,對於使用者的操作作出響應,讓模型和檢視進行必要的互動,即通過檢視修改、獲取模型中的資料;當模型中的資料變化時,讓檢視更新顯示。
MVC結構可以使程式更具有物件化特性,也更容易維護。
2.對話方塊
2.1訊息對話方塊
訊息對話方塊是有模式對話方塊,進行一個重要的操作動作之前,最好能彈出一個訊息對話方塊。
public static void showMessageDialog(
Component parentComponent,
String message,
String title,
int messageType)
引數parentComponent指定對話方塊可見時的位置,如果parentComponent為null,對話方塊會在螢幕正前面顯示出來。message指定對話方塊上顯示的訊息,title指定對話方塊的標題,messageType取值是JOptionPane中的類常量。
2.2輸入對話方塊
輸入對話方塊含有供使用者輸入文字的文字框、一個確認和取消按鈕,是有模式對話方塊。
public static
String showInputDialog(Component parentComponent,
Object message,
String title,
int messageType)
2.3確認對話方塊
確認對話方塊是有模式對話方塊。返回的具體值依賴於使用者所單擊的對話方塊上的按鈕和對話方塊上的關閉圖示。
public static int showConfirmDialog(Component parentComponent,
Object message,
String title,
int optionType)
2.4顏色對話方塊
public static Color showDialog(Component component,
String title,
Color initialColor)
initialColor指定顏色對話方塊返回的初始顏色。
2.6自定義對話方塊
建立對話方塊與建立視窗類似,通過建立JDialog的子類來建立一個對話方塊類,然後這個類的一個例項,即這個子類建立的一個物件,就是一個對話方塊。對話方塊是一個容器,它的預設佈局是BorderLayout,對話方塊可以新增元件,實現與使用者的互動操作。
兩個常用構造方法:
JDialog() 構造一個無標題的初始不可見的對話方塊,對話方塊依賴一個預設的不可見的視窗。
JDialog(JFrame owner) 構造一個無標題的初始不可見的無模式的對話方塊,owner是對話方塊所依賴的視窗,如果owner取null,對話方塊依賴一個預設的不可見的視窗。
3.樹元件與表格元件
3.1樹元件
JTree類的物件稱為元件,也是常用元件之一。
- DefaultMutableTreeNode結點
樹元件由結點組成,要想構造一個樹元件,必須實現為其建立節點物件。樹種只有一個根結點。其他結點分為兩類:一類是帶子結點的分支結點,另一類是不帶子結點的葉結點。
DefaultMutableTreeNode類的兩個常用的構造方法是:
DefaultMutableTreeNode(Object userObject)
DefaultMutableTreeNode(Object userObject,boolean allowChildren)
(2)樹上的TreeSelectionEvent事件
使用addTreeSelectionListener(TreeSelectionListener listener)
方法獲得一個監視器。
建立監視器的類必須實現TreeSelectionListener介面,介面中的方法是public void valueChanged(TreeSelectionEvent e)。
樹使用getLastSelectedPathComponent()方法獲取選中的結點。
3.2表格元件
表格元件以行和列的形式顯示資料,允許對錶格中的資料進行編輯。
JTable常用的3個構造方法:
JTable() 建立預設的表格模型。
JTable(int a,int b) 建立a行,b列的預設模型表格
JTable (Object data[][],Object columnName[]) 建立預設表格模型物件,並且顯示由data指定的二維陣列的值,其列名由陣列columnName指定。
在表格中輸入或修改資料後,需按回車或用滑鼠單擊表格的單元格確定所輸入或修改的結果。當表格需要重新整理顯示時,讓表格呼叫repaint方法。
4.按鈕繫結到鍵盤
指定監視器的步驟:
- 獲取輸入對映
按鈕首先呼叫public final InputMap getInputMap(int condition) 方法返回一個InputMap物件.
- 繫結按鈕的鍵盤操作
步驟(1)返回的輸入對映首先呼叫方法public void put(KeyStroke keyStroke,Object actionMapKey),將敲擊鍵盤上的某鍵指定為按鈕的鍵盤操作.
- 為按鈕的鍵盤操作指定監視器
按鈕呼叫方法public final ActionMap getActionMap()返回一個ActionMap物件:ActionMap actionmap = button.getActionMap();然後,該物件actionmap呼叫方法: public void put(Object key,Action action) 為按鈕的鍵盤操作指定監視器
5.列印元件
列印元件工作步驟如下:
(1)獲取ToolKit物件
讓元件呼叫getToolkit()方法返回系統提供的Toolkit物件。
(2)獲得PrintJob物件
Toolkit物件呼叫getPrintJob()方法返回一個PrintJob物件。
(3)獲取Graphics物件
PrintJob物件使用getGraphics()方法獲得一個Graphics物件。
(4)列印元件
步驟3獲取的Graphics物件是g,元件呼叫paintAll(g)將打印出該元件及其子元件。如果呼叫方法: pain(g)將打印出該元件本身,但不列印子元件。
6.釋出GUI程式
6.1首先用文字編輯器編寫一個清單檔案
6.2生成JAR檔案
第十章
1.File類
File物件主要用來獲取檔案本身的一些資訊。
建立一個File物件的構造方法有3個:
File(String filename);(檔名字)
File(String directoryPath,String filename);(檔案的路徑)
File(File dir, String filename);(目錄)
1.1檔案的屬性
File類的下列方法獲取檔案本身的一些資訊。
public String getName() 獲取檔案的名字。
public boolean canRead() 判斷檔案是否是可讀的。
public boolean canWrite() 判斷檔案是否可被寫入。
public boolean exits() 判斷檔案是否存在。
public long length() 獲取檔案的長度(單位是位元組)。
public String getAbsolutePath() 獲取檔案的絕對路徑。
public String getParent() 獲取檔案的父目錄。
public boolean isFile() 判斷檔案是否是一個普通檔案,而不是目錄。
public boolean isDirectroy() 判斷檔案是否是一個目錄。
public boolean isHidden() 判斷檔案是否是隱藏檔案。
public long lastModified() 獲取檔案最後修改的時間。
1.2目錄
(1)建立目錄
呼叫方法public boolean mkdir()
(2)列出目錄中的檔案
public String[] list() 用字串形式返回目錄下的全部檔案。
public File [] listFiles() 用File物件形式返回目錄下的全部檔案。
public String[] list(FilenameFilter obj) 用字串形式返回目錄下的指定型別的所有檔案。
public File [] listFiles(FilenameFilter obj) 用File物件形式返回目錄下的指定型別所有檔案。
引數FilenameFilter是一個介面,該介面有一個方法:public boolean accept(File dir,String name);
1.3檔案的建立與刪除
1.4執行可執行檔案
2.檔案位元組輸入流
使用輸入流通常包括4個基本步驟:
(1)設定輸入流的源
(2)建立指向源的輸入流
(3)讓輸入流讀取源中的資料
(4)關閉輸入流。
2.1構造方法
使用FileInputStream類的下列構造方法建立指向檔案的輸入流。
FileInputStream(String name);(使用給定的檔名)
FileInputStream(File file); (使用File物件)
引數name和file指定的檔案稱為輸入流的源。
位元組輸入流的read方法:
int read() 讀取單個位元組的資料,返回位元組值(0~255整數),如果未讀出位元組就返回-1。
int read(byte b[]) 讀取b.length個位元組到位元組陣列b中,返回實際讀取的位元組數。如果到達檔案的末尾,則返回-1。
int read(byte b[], int off, int len) 讀取len個位元組到位元組陣列b中,並返回實際讀取的位元組數目。如果到達檔案的末尾,則返回-1,引數off指定從位元組陣列的某個位置開始存放讀取的資料。
2.3關閉流
輸入流都提供關閉方法close();
3.檔案位元組輸出流
使用輸出流通常包括4個基本步驟:
(1)給出輸出流的目的地
(2)建立指向目的地的輸出流
(3)讓輸出流把資料寫入到目的地
(4)關閉輸出流。
3.1構造方法
使用FileOutputStream類的下列具有重新整理功能的構造方法建立指向檔案的輸出流。
FileOutputStream(String name);(使用給定檔名)
FileOutputStream(File file);(使用File物件)
引數name和file指定的檔案稱為輸出流的目的地
3.2使用輸出流寫位元組
輸出流的wirie方法以位元組單位向目的地寫資料。
void write(int n) 向目的地寫入單個位元組。
void write(byte b[]) 向目的地寫入一個位元組陣列。
void write(byte b[],int off,int len) 從位元組陣列中偏移量off處取len個位元組寫到目的地。
3.3關閉流
通過呼叫close()方法,可以保證作業系統把流緩衝區的內容寫到它的目的地,即關閉輸出流可以把該流所用的緩衝區的內容沖洗掉(通常沖洗到磁碟檔案上)。
4.檔案字元輸入、輸出流
5.緩衝流
BufferedReader和BufferedWriter類建立的物件稱作緩衝輸入、輸出流。二者的源和目的地必須是字元輸入流和字元輸出流。
構造方法:
BufferedReader(Reader in);
BufferedWriter (Writer out);
BufferedReader和BufferedWriter類讀寫檔案的方法:
readLine() 讀取文字行
write(String s,int off,int len) 把字串s寫到檔案中
newLine(); 向檔案寫入一個回行符
6.隨機流
使用RandomAccessFile類來建立一個隨機訪問檔案流。RandomAccessFile類建立的流的指向既可以作為源也可以作為目的地。
構造方法:
RandomAccessFile(String name,String mode) ;
RandomAccessFile(File file,String mode) ;
相關方法:
seek(long a) 定位RandomAccessFile流的讀寫位置
getFilePointer() 獲取流的當前讀寫位置
7.陣列流
7.1位元組陣列流
位元組陣列輸入流ByteArrayInputStream和位元組陣列輸出流ByteArrayOutputStream分別使用位元組陣列作為流的源和目標。
ByteArrayInputStream構造方法及常用方法
ByteArrayInputStream(byte[] buf);
ByteArrayInputStream(byte[] buf,int offset,int length);
public int read();順序地從源中讀出一個位元組
public int read(byte[] b,int off,int len);順序地從源中讀出引數len指定的位元組數
ByteArrayOutputStream流構造方法及常用方法
ByteArrayOutputStream();
ByteArrayOutputStream(int size);
public void write(int b); 順序地向緩衝區寫入一個位元組
public void write(byte[] b,int off,int len); 將引數b中指定的len個位元組順序地寫入緩衝區
public byte[] toByteArray(); 返回輸出流寫入到緩衝區的全部位元組
7.2字元陣列
CharArrayReader和CharArrayWriter類是字元陣列流,使用字元陣列作為流的源和目標。
8.資料流
DataInputStream和DataOutputStream類建立的物件稱為資料輸入流和資料輸出流。
構造方法:
DataInputStream(InputStream in)建立的資料輸入流指向一個由引數in指定的底層輸入流
DataOutputStream(OutnputStream out)建立的資料輸出流指向一個由引數out指定的底層輸出流
9.物件流
ObjectInputStream和ObjectOutputStream類建立的物件稱為物件輸入流和物件輸出流。writeObject(Object obj) 將一個物件obj寫入到一個檔案,readObject() 讀取一個物件到程式中
構造方法:
ObjectInputStream(InputStream in)
ObjectOutputStream(OutputStream out)
一個類如果實現了Serializable介面,那麼這個類建立的物件就是所謂序列化的物件。
10.序列化與物件克隆
如果一個“複製品”實體的變化不會引起原物件實體發生變化,反之亦然。這樣的複製品稱為原物件的一個克隆物件或簡稱克隆。
物件輸入流通過物件的序列化資訊來得到當前物件的一個克隆。
11.使用Scanner解析檔案
11.1使用預設分隔標記解析檔案
建立Scanner物件,並指向要解析的檔案。
11.2使用正則表示式作為分隔標記解析檔案:
建立Scanner物件,指向要解析的檔案,並使用useDelimiter方法指定正則表示式作為分隔標記。
12.檔案對話方塊
檔案對話方塊是一個選擇檔案的介面。構造方法JFileChooser()建立初始不可見的有模式的檔案對話方塊。然後檔案對話方塊呼叫下述2個方法:
showSaveDialog(Component a);
showOpenDialog(Component a);
都可以使得對話方塊可見,只是呈現的外觀有所不同,showSaveDialog方法提供儲存檔案的介面,showOpenDialog方法提供開啟檔案的介面。上述兩個方法中的引數a指定對話方塊可見時的位置,當a是null時,檔案對話框出現在螢幕的中央;如果元件a不空,檔案對話方塊在元件a的正前面居中顯示。
13.帶進度條的輸入流
如果讀取檔案時希望看見檔案的讀取進度可以使用javax.swing包提供的輸入流類ProgressMonitorInputStream。
構造方法:
ProgressMonitorInputStream(Conmponent c,String s,InputStream);
14.檔案鎖
FileLock、FileChannel類處理Java提供的檔案鎖功能。它們分別在java.nio和java.nio.channels包中。輸入、輸出流讀寫檔案時可以使用檔案鎖。
RondomAccessFile建立的流在讀寫檔案時使用檔案鎖的步驟如下:
(1)先使用RondomAccessFile流建立指向檔案的流物件,該物件的讀寫屬性必須是rw。
(2)input流呼叫方法getChannel()獲得一個連線到地層檔案的FileChannel物件(通道)。
(3)通道呼叫tryLock()或lock()方法獲得一個FileLock(檔案鎖)物件,這一過程也稱作對檔案加鎖。
教材學習中的問題和解決過程
看了幾遍都看不懂,結合例子之後能懂個大概。
程式碼除錯中的問題和解決過程
多看例子,能更好的深入理解方法的使用。
其他
還是要多敲程式碼才可以啊。
學習進度條
|
程式碼行數(新增/累積) |
部落格量(新增/累積) |
學習時間(新增/累積) |
重要成長 |
目標 |
2000行 |
10篇 |
80小時 |
|
第一週 |
67/67 |
1/1 |
8/8 |
|
… |
… |
… |
… |
|
第九周 |
300/2312 |
1/8 |
8/72 |
|
參考資料
《Java2實用教程(第5版)》