黑馬程式設計師----JAVA基礎之GUI視覺化程式設計與列舉&網路程式設計
------ android培訓、java培訓、期待與您交流! ----------
一、GUI視覺化程式設計
1. GUI視覺化程式設計是什麼?
就是讓介面可視,點選觸發事件
2. GUI視覺化程式設計有什麼用?
讓java程式用一個視窗介面直觀的表示所操作的動作和結果,操作更方便
3. GUI的佈局
A:流式佈局B:邊界佈局
C:網格佈局
D:網格包佈局
E:卡片佈局管
4. GUI的事件處理機制
三個重要的概念:
A:事件:使用者對元件的一個操作,稱之為一個事件。
B:事件源:發生事件的元件就是事件源
C:事件處理器:某個java類中的負責處理時間的成員方法
一般,我們把某個元件新增一個事件監聽.當他產生了某個事件的時候,就會按照對應的處理去執行.
事件分類:
MouseEvent WindowEvent ActionEvent
處理髮生在某個GUI元件上的XxxEvent時間的某個情況,其事件處理的通用編寫流程:
1.編寫一個實現了XxxListenener
2.XxxListener類中的用於處理該事件情況的方法中,編寫處理程式碼
3.呼叫組建的AddXxxListener方法,將類Xxxlistener建立的實力註冊到GUI組建上
5. GUI視覺化程式設計怎麼用?
格式:步驟
建立視窗---建立各種元件(選單,文字框,文字域)-----新增各種元件----給各種元件新增監聽器-----給元件新增事件處理
private Frame f; private TextField tf; private Button bt, bt1; private TextArea ta; private MenuBar mb; private Menu m, m1; private MenuItem mi,mi1,mi2,mi3,mi4; public MyFormat() { init(); } private void init() { // 建立一個視窗 f = new Frame(); //設定視窗名稱 f.setTitle("不會回來"); // 設大小位置 f.setBounds(400, 300, 400, 300); // 設制佈局--流式佈局 f.setLayout(new FlowLayout()); //建立一個文字框 tf = new TextField(20); //建立一個按鍵 bt = new Button("輸入"); //再建立一個按鍵 bt1 = new Button("列印"); //建立一個文字域 ta = new TextArea(10, 40); //建立一個選單欄 mb = new MenuBar(); //建立一個選單 m = new Menu("檔案"); //再建立一個選單 m1 = new Menu("更改標題"); //建立選單項 mi = new MenuItem("退出系統"); mi1 = new MenuItem("記事本"); mi2 = new MenuItem("好好學習"); mi3 = new MenuItem("天天向上"); mi4 = new MenuItem("恢復標題"); //將選單欄新增到視窗上 f.setMenuBar(mb); //將選單新增至選單欄 mb.add(m); //再將選單項新增至選單m m.add(m1); m.add(mi); m.add(mi1); //再給m1新增選單項 m1.add(mi2); m1.add(mi3); m1.add(mi4); //給視窗新增文字框 f.add(tf); //給視窗新增按鈕 f.add(bt); f.add(bt1); //給視窗新增文字域 f.add(ta); //建立監聽方法 myEvent(); //讓視窗可見 f.setVisible(true); } private void myEvent(){ //給視窗新增關閉事件 f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); //給選單項mi新增事件 mi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); //給選單項新增事件 mi1.addActionListener(new ActionListener() { //給mi2建立事件 public void actionPerformed(ActionEvent e) { Runtime r =Runtime.getRuntime(); try { r.exec("notepad"); f.setVisible(false); System.exit(0); } catch (IOException e1) { e1.printStackTrace(); } } }); //給文字框新增事件 bt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //讓文字框寫入到檔案中 PrintWriter pw =null; try { pw = new PrintWriter(new FileWriter("Frame.txt",true),true); pw.println(tf.getText()); } catch (IOException e1) { e1.printStackTrace(); }finally{ if (pw!=null) { pw.close(); //寫完之後清空文字框 tf.setText(""); } } } }); //設立文字域事件 bt1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { //讓文字域據接收資料 //寫前之清空文字框 ta.setText(""); BufferedReader br=null; try { br= new BufferedReader(new FileReader("Frame.txt")); try { String s=null; System.out.println(s); while ((s=br.readLine())!=null) { ta.append(s+"\t\n"); } } catch (IOException e1) { e1.printStackTrace(); } } catch (FileNotFoundException e1) { e1.printStackTrace(); }finally{ if (br!=null) { try { br.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } }); } }
二、列舉
1. 什麼是列舉?
列舉是一個特殊的java類,用關鍵字enum表示,不用class,其建構函式私有化,裡面提供固定的物件也就是列舉.聲名多少個列舉,就有多少個物件.也就是在外部無法再建立這個類的物件,只能用其提供的物件.
底層就是私用化構造方法,並定義幾個 public static final 修飾的物件,外部直接用類名打點調物件名獲取物件,物件名就是列舉.
2. 列舉有什麼用?
列舉可以限定外部能使用的類的物件,從而提高了程式的安全性.並簡化程式碼
3. 列舉怎麼用?
外部直接用類名打點調獲取物件,並呼叫類成員:Print.A.print()
1. 聲名不帶構造方法的列舉
enum Print{
A,B,C;
}
1.聲名帶構造的列舉
enum Print{
A("a"),B("a"),C("a");
String s;
private Test(String s){
this.s=s;
}
}
2.定義帶抽象方法的列舉,多用於讓列舉實現不同的返回值.
enum Print {
A {
String print() {
return"A";
}
},B {
String print() {
return"B";
}
};
abstract String print();
}
2. 列舉常用特有方法:
String name() 返回此列舉常量的名稱,在其列舉宣告中對其進行宣告。 如:Print.A.name()=="A";
int ordinal() 返回列舉常量的索引(它在列舉宣告中的位置,其中初始常量序數為零)。
public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name)
返回帶指定名稱的指定列舉型別的列舉常量。名稱必須與在此型別中宣告列舉常量所用的識別符號完全匹配。(不允許使用額外的空白字元。)
引數:
enumType - 要從中返回常量的列舉型別的 Class 物件
name - 要返回的常量名稱
返回:帶指定名稱的指定列舉型別的列舉常量 (列舉類和其)
例如: String s = "B";
//下面兩種都可以.
Print a = Print.valueOf(Print.class, s);
a = Print.valueOf(s);
4. 列舉什麼時候用?
當需要讓一個類只提供固定的物件的時候.
5. 列舉有什麼特點?
1.列舉構造方法必須私有
2.聲名列舉,必須在類裡的首行,列舉間用逗號隔開,如果還有其它程式碼則最後一個列舉後必須加分號
3.列舉有類的特性,可以聲名屬性和方法,也可以實現介面和繼承抽象類.
4.JDK1.5後,swith可以接收列舉型別
5.如果列舉只有一個值時,可以當單例用.
其實在 java 的列舉實現,這些列舉值還是與某個整形常量值對應的
//列舉類DownloadStatus程式碼
public enum DownloadStatus {
Remote_File_Noexist, //遠端檔案不存在
Local_Bigger_Remote, //本地檔案大於遠端檔案
Download_From_Break_Success, //斷點下載檔案成功
Download_From_Break_Failed, //斷點下載檔案失敗
Download_New_Success, //全新下載檔案成功
Download_New_Failed; //全新下載檔案失敗
} 比如這程式碼
三 . 網路程式設計
1. 什麼是網路程式設計?
就是用來實現網路互連的不同計算機上執行的程式間可以進行資料交換。
2. 網路程式設計有什麼作用?
可以計算機之間相互通訊,並進行資料傳輸
3. 網路程式設計怎麼用?
InetAddress類的使用:
沒有構造方法,但可以通過getLocalHost etByName 獲取物件
要掌握的功能
獲取本地主機:getLocalHost
InetAddress address =InetAddress.getLocalHost();
獲取任意指定主機:getByName
InetAddress address = InetAddress.getByName("fada-PC");
主機Ip地址:getHostAddress
String ip = address.getHostAddress();
主機名:getHostName
String name = address.getHostName();
UDP傳輸:
格式步驟:
DatagramSocket與DatagramPacket
建立傳送端,接收端。
建立資料包。
呼叫Socket的傳送接收方法。
關閉Socket。
傳送端與接收端是兩個獨立的執行程式。
做一個傳送端:
//建立傳送端
DatagramSocket ds = new DatagramSocket();
//建立位元組輸入流並用轉換流轉換成一個字元緩衝
BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));
//把字元流中的資料讀出
String s =null;
while((s=br.readLine())!=null){
if("886".equals(s)){
byte[] bye = s.getBytes();
//把字元流讀出的資料存在資料包中 建立資料包
break;
}
byte[] bye = s.getBytes();
//把字元流讀出的資料存在資料包中建立資料包
DatagramPacket dp = new DatagramPacket(bye,bye.length,InetAddress.getByName("fada-pc"),11118);
//把資料包傳送出去
ds.send(dp);
}
//關閉資源
ds.close();
br.close();
接收端:
//給定建立接收端
DatagramSocket ds = new DatagramSocket(11118);
//建立一個給定容量的資料包
while(true){
byte[] bye =new byte[1024];
DatagramPacket dp = new DatagramPacket(bye,bye.length);
//將資料包載入到快取中
ds.receive(dp);
//解析資料包中的IP
String ip = dp.getAddress().getHostAddress();
//解析資料包中的陣列接收的內容
String text = new String(bye,0,dp.getLength());
System.out.println(ip+"***"+text);
}
TCP傳輸
①使用Socket和ServerSocket,
②建立客戶端和伺服器端,
③建立連線後,通過Socket中的IO流進行資料的傳輸
④關閉socket
客戶端與伺服器端也是兩個獨立的應用程式。
a.TCP協議的客戶端
思路:
1:建立客戶端的Socket服務,並明確要連線的伺服器。
2:如果連線建立成功,就表明,已經建立了資料傳輸的通道.就可以在該通道通過IO進行資料的讀取和寫入.
該通道稱為Socket流,Socket流中既有讀取流,也有寫入流.
3:通過Socket物件的方法,可以獲取這兩個流
4:通過流的物件可以對資料進行傳輸
5:如果傳輸資料完畢,關閉資源
程式碼:
Socket s = new Socket("192.168.1.34", 10010);
OutputStream os = s.getOutputStream();
os.write("Hello,Tcp,I am coming".getBytes());
s.close();
b.TCP協議的伺服器端
思路:
1:建立伺服器端的socket服務,需要一個埠
2:服務端沒有直接流的操作,而是通過accept方法獲取客戶端物件,在通過獲取到的客戶端物件的流和客戶端進行通訊
3:通過客戶端的獲取流物件的方法,讀取資料或者寫入資料
4:如果服務完成,需要關閉客戶端,然後關閉伺服器,但是,一般會關閉客戶端,不會關閉伺服器,因為服務端是一直提供服務的
程式碼:
ServerSocket ss = new ServerSocket(10010);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println("客戶端的ip:"+ip + "*連線上");
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String text = new String(bys, 0, len);
System.out.println(text);
ss.close();
c.TCP協議的程式伺服器給客戶端一個反饋
客戶端和伺服器端在原有的基礎上新增反饋,接收端的部分寫到客戶端下邊,客戶端的部分寫到接收端下邊
d.一個大寫的轉換伺服器
客戶端程式碼:
Socket s = new Socket("192.168.1.34", 10086);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader brServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line)) {
break;
}
bw.write(line+"\r\n");
bw.flush();
String serverText = brServer.readLine();
System.out.println("server:" + serverText);
}
br.close();
s.close();
注意:
1.字元流是有緩衝區的,每次資料寫入後,需要重新整理緩衝區。
2.這樣操作後發現還是不行,那麼還有什麼原因呢?
3.考慮readLine的特點。一次讀取一行。但是不要忽略它的結束條件是:\r\n
伺服器程式碼:
ServerSocket ss = new ServerSocket(10086);
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
bw.write(line.toUpperCase()+"\r\n");
bw.flush();
}
ss.close();
e.用PrintWriter改寫轉換伺服器
注意println和true的使用
4. 網路程式設計什麼時候用?
計算機間需要進行資料傳輸時
5. 網路程式設計有什麼特點?
網路通訊三要素
IP地址:InetAddress :網路中裝置的標識,不易記憶,可用主機名
埠號 :用於標識程序的邏輯地址,不同程序的標識