項目html |
內容java |
這個做業屬於哪一個課程程序員 |
https://www.cnblogs.com/nwnu-daizh算法 |
這個做業的要求在哪裏express |
https://www.cnblogs.com/nwnu-daizh/p/11867214.html編程 |
做業學習目標數組 |
(1) 掌握Vetor、Stack、Hashtable三個類的用途及經常使用API;安全 (2) 掌握ArrayList、LinkList兩個類的用途及經常使用API;多線程 (3) 瞭解java集合框架體系組成;架構 (4) 掌握Java GUI中框架建立及屬性設置中經常使用類的API; (5) 瞭解Java GUI中2D圖形繪製經常使用類的API;
|
第一部分 基礎知識總結
1、Java集合框架
Java提供的一組類:Vector、Stack、Hashtable、BitsSet與Enumeration接口。其中Enumeration接口提供了一種用於訪問任意容器中各個元素的抽象機制。
1.將集合的接口與實現分離
(a)隊列接口指出能夠在隊列尾部添加元素,在隊列的頭部添加元素,而且能夠查找隊列中元素的個數。有「先進先出」的規則。
隊列接口的簡單形式,例如:
public interface Queue<E>//a simplified form of the interface in the standard library
{ void add(E element); E remove(); int size(); }
(b)隊列的兩種實現方式:
(1)使用循環數組:例ArrayQueue類(2)使用鏈表:例 LinkedList類; 每個實現均可以經過一li個實現了Queue接口的類表示。
(c)只有在構建集合對象時,使用具體的類纔有意義。可使用接口類型存放集合的引用。
Queue<Customer> expressLane = new CircularArrayQueue<>(100); expressLane.add(new Customer("Harry"));
利用這種方式,當想法改變時,是須要改變調用構造器的地方便可。循環數組是一個遊街集合,即容量有限。
2.Collection接口
java中集合的基本接口爲Collection接口。這個接口有兩個基本方法,例以下:
public interface Collection<E> { boolean add(E element); Iterator<E> iterator(); ... }
add方法用於向集合中添加元素,若是添加的元素確實改變了集合就返回true,若是集合沒有發生改變就返回false. iterator方法用於返回一個實現了Iterator接口的對象。可使用這個迭代對象一次訪問集合中的元素。
3.迭代器
iterator接口包含四個方法:
public interface Iterator<E> { E next(); boolean hasNext(); void remove(); default void forEachRemaning(Consumer<? super E>action); }
反覆調用next方法,能夠逐個訪問集合中的每一個元素。當到達集合末尾時,next將會輸出NoSuchElementException.所以,在調用next以前調用hasNext方法。若是迭代對象還有多個供訪問的元素,這個方法就返回true。
若是想要查看集合中的全部元素,就請求一個迭代器,並在hasNext返回ture時反覆地調用next方法。Collection接口擴展Iterable接口。所以,標準類庫中的任何集合均可以使用「for each」循環。
元素被訪問的順序取決於於集合類型。應該將java迭代器認爲是 位於兩個元素之間的。當調用next時,迭代器就超過下一個元素,並返回剛剛越過的哪一個元素的引用。
Interator接口的remove方法將會刪除上次調用next時返回的元素。next和remove方法的調用具備相互依賴性。若是調用remove以前沒有調用next時不合法的。例如:
it.remove(); it.next(); it.remove();//OK
4.泛型實用方法
Collection與Iterator都是泛型接口,能夠編寫操做任何集合類型的實用方法。另外,Collectio接口聲明瞭不少方法。例如:
Iterator<E> iterator()//返回一個用於訪問集合中每一個元素的迭代器
int size()//返回當前存儲在集合中的元素個數
boolean add(Object element)//將一個元素添加在集合中。若是這個調用改變了集合,返回true。
boolean remove(Object obj)從這個集合中刪除等於obj的對象。若是有匹配的對象被刪除,返回true.
List是一個有序集合。元素會增長到容器中的特定位置。有兩種方法:(1)使用迭代器訪問(2)使用一個整數索引來訪問(隨機訪問),由於這樣能夠按任意順序訪問元素。可是,使用迭代器訪問時,必須順序地訪問元素。List接口定義的多個隨機訪問方法:void add(int index,E element) void remove(int index) E get(int index) E set(int index, E element)
ListIterator接口時Iterator的一個子接口。它定義了一個方法用於在迭代器位置前面增長一個元素:void add(E element).
2、具體的集合
1.鏈表
在java語言中,,全部列表實際上都是雙向連接的——每個還存放着指向前驅節點的引用。鏈表是一個有序集合。
2.數組列表
List接口用於描述有序集合,且有兩種中訪問元素的協議,(a)用迭代器(b)用get和set方法隨機地訪問每一個元素。第二章方法不適用於鏈表卻適用於數組,集合類提供了熟悉的ArrayList類,這個類也實現了List接口。
ArrayList封裝了一個每一個列表稱爲桶動態再分配的對象數組。
3.散列表
散列表由米娜子就可看出時沒有肯定位置的。可是散列表會爲每個元素對象計算一個整數,稱爲散列碼。散列碼是由對象的實例域產生的一個整數。或者說,具備不一樣數據域的對象產生不一樣的散列碼。
在java中,散列表用數組列表實現。在散列表中由有: HashSet()//用來構造新散列表........
4.樹集
樹集是一個有序集合。能夠以任意順序將元素插入到集合中。自對集合進行遍歷時,每一個值將自動地按排序後的順序呈現。建立一個樹集的方法爲:TreeSet()
5.隊列與雙端隊列
有兩個端頭的隊列稱爲雙端隊列。可在頭部和尾部同時添加或者刪除元素。不支持在隊列中間插入。
6.優先級隊列
可按任意順序插入的元素,但按照排序的順序進行檢索。優先級隊列用了堆(能夠自我調整的二叉樹)。一個優先級對象能夠保存實現了Comparable接口的類對象,也能夠保存在構造器中提供的Comparator對象。
3、映射
當咱們知道某些關鍵信息且想茶軸與之對應的元素時的這種接口可稱之爲映射。映射用來存放鍵/值對。
1.映射的基本操做
java類庫爲映射提供了兩個實現:HashMap和TreeMap。這兩個類都實現了Map接口。每當往映射中添加對象時,必須同時提供一個鍵,這裏,鍵是一個字符串,對應的值是Employee對象。
並且,鍵必須是惟一的,不能對同一個鍵存放兩個值。
2.更新映射項
(1)能夠用getOrDefault方法(2)調用putIfAbsent方法,只有當鍵原先存在時纔會放入一個值。merge方法能夠簡化這個操做。
3.映射視圖
集合框架能夠獲得映射的視圖。這是實現了Collection接口或某個子接口的對象。
4.弱散列映射
5.連接散列集與映射
連接散列映射將用訪問順序,而不是插入順序,對映射條目進行迭代。
6.枚舉集與映射
EnumSet是一個枚舉類型元素集的高效實現。枚舉類型只有有限個實例,因此EnumSet內部用序列實現。EnumMap是一個鍵類型爲美劇類型的映射。它能夠直接且有效的用一個數值組實現。
7.標識散列映射
4、視圖與包裝器
1.什麼時視圖?
(1). Arrays.asList方法
在Arrays類中有一個靜態方法--asList方法,這個方法做用是:將普通的Java數組包裝成一個List集合。例如:
String []strings = new String[10]; strings[0] = "pby"; strings[1] = "pby1"; strings[2] = "pby2"; List<String> stringList = Arrays.asList(strings);
返回的對象不是一個ArrayList對象。它就是一個視圖對象,這個對象帶有底層數組的get和set方法。
那這個視圖對象與普通的List或者ArrayList對象有什麼區別嗎?
在這裏,視圖對象不能操做全部改變數組大小的方法(好比說,add方法和remove方法),在調用這些方法的時候,程序會拋出一個UnsupportedOperationException異常;可是普通的List對象可以正常的調用改變數組大小的方法。
(2). Collections.nCopies方法
與Arrays.asList方法相似的另外一個方法那就是在Collection中的nCopies方法。例如:
List<String> stringList = Collections.nCopies(100, "pby");
上面的代碼將建立一個包含100個"pby"字符串的List集合對象。這樣的操做優點在於存儲代價很小,由於這個對象不能修改大小。這就是視圖技術的一種巧妙應用。
List<String> list = new ArrayList<>(); for (int i = 0; i < 20; i++) { list.add("" + i); } System.out.println(list); //獲取第10個~第19個 List<String> list2 = list.subList(9, 20); System.out.println(list2); System.out.println(list); //清空自子範圍視圖以後,原來的List集合對象相應位置的數據也會被自動清空的 list2.clear(); System.out.println(list2); System.out.println(list);
4,不可修改的視圖
Collections還有幾個方法,用於產生集合的不可修改視圖。這些視圖對現有的集合增長了一個運行時的檢查。若是發現對集合進行修改的話(這裏不只僅是改變數組的大小,而且包括set之類的方法),就會拋出一個異常,同時這個集合將保持未修改的狀態。
可使用以下8種方法來得到不可修改的視圖:
每一個方法都定義於一個接口。例如,Collections.unmodifiableList方法定義於List接口,與ArrayList、LinkedList或者任何實現了List接口的其餘類一塊兒協同工做。
例如,假設想要查看某個集合的內容,可是又能避免這個集合會被修改的狀況,就能夠進行下列的操做:
LinkedList<String> list = new LinkedList<>(); list.add("pby"); list.add("pby2"); List<String> list2 = Collections.unmodifiableList(list); //是不能被修改的 //list2.set(0, "dasdas");
Map<String, String> map = Collections.synchrizedMap(new HashMap<String, String>());
就能夠自由的使用多線程來訪問map對象了。像get和put這類方法都是同步操做的,即在另外一個線程中調用另外一個方法以前,剛纔的方法調用必須完全執行完畢。
6.受查視圖
受查視
List<String> list = new ArrayList<>(); List list2 = list; //程序運行到這裏是不會報錯的,可是若是後面訪問這裏元素, //而且試圖強制轉換爲String類型的變量纔會拋出一個ClassCastException的異常 list2.add(10); //這裏會拋出ClassCastException異常 //String string = (String) list2.get(0);
List<String> list3 = Collections.checkedList(list, String.class); List list4 = list3; //程序運行到這裏就會拋出一個ClassCastException的異常 list4.add(10);
雖然在編譯時,程序是沒有報錯的,可是程序一旦運行到add方法那裏直接會拋出一個ClassCastException的異常。也就是說,經過受查視圖,能夠逃避編譯時的檢查,可是躲不過運行時的檢查。
5、算法
第十章 圖形程序設計
1.Swing概述
swing並無徹底取代AWT,而是基於AWT架構之上。swing僅僅提供了功能更增強大的用戶界面組件。,尤爲是在用swing編寫程序是,仍是須要使用基本的AWT處理時間。從如今開始,swing是指被繪製的用戶界面類,而awt是指像事件處理這樣抽象窗口工具箱的底層機制。
雖然在用戶屏幕上顯示基於swing的用戶界面組件比現實awt基於對等體的界面元素要慢一些,但在計算機快速運行下這沒什麼。如下緣由讓人們選擇swing:
1.swing擁有一個豐富、便捷的用戶界面元素集合。二、swing對平臺的依賴很小,意味着他有不多的關於平臺的bug。3.給予用戶一致的感受。
對於第三點存在一些潛在問題,若在全部平臺上用戶界面元素看起來都同樣,他們可能與平臺的本地控件不同,而這些平臺的用戶對此可能並不熟悉。swing採起一種巧妙的方式解決。指定觀感(look and feel)。
注意:
1. swing類位於javax.swing包中。包名錶示這是Java的一個擴展包。不過在1.2版本後,每一個Javase實現中都必須包含他。
2. 全部的swing組件都必須由事件分派線程(Event dispatch thread)進行配置,線程將按鍵控制和鼠標點擊轉移 到用戶接口組件中。可是許多swing程序並無這麼作,而是直接在主程序中完成初始化。因爲swing 組件很複雜,jdk程序員不能保證這種方式的安全性 ,爲了以防萬一,儘管代碼看起來神祕,可是最好的 選擇。
2.建立框架
建立框架
在Java中,頂層窗口(就是沒有包含在任何其餘窗口中的窗口)被稱爲框架(frame)。
在AWT庫中有一個稱爲Frame的類,用於描述頂層窗口。這個類的Swing版本名爲JFrame,它擴展於Frame類。
JFrame是極少數幾個不繪製在畫布上的Swing組件之一。所以,它的修飾部件(按鈕、標題欄、圖標等)由用戶的窗口系統繪製,而不是由Swing繪製。
注意:絕大多數Swing組件類都以「J」開頭,例如,JButton,JFrame等。在Java中有Button和Frame這樣的類,但它們屬於AWT組件。若是偶爾忘記了「J」程序仍然能夠編譯和運行,可是將Swing和AWT組件混合在一塊兒使用將會致使視覺和行爲的不一致。
如今咱們來作一個示例,依然是選擇使用工具Eclipse。
首先爲了便於管理和維護,咱們創建一個包,包名起爲SwingDemo。而後創建它的子包No1。
在首先編寫框架代碼JframeDemo.java子包內咱們先創建兩個文件,一個是用於創建框架的文件JframeDemo.java,用來存放框架代碼,另外一個用於演示的文件Demo.java用來編寫main方法作演示。
首先編寫框架代碼JframeDemo.java:
public class JframeDemo extends JFrame{ private static final int DEFAULT_WIDTH=300; private static final int DEFAULT_HEIGHT=300; public JframeDemo(){ setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT); } }
Demo演示文件編寫以下:
public class Demo{ public static void main(String[] args){ EventQueue.invokeLater(()->{ JFrame frame=new JframeDemo(); frame.setDefaultCloseOperation("JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } }
3.框架定位
JFrame類自己只包含若干個改變外觀的方法。然而,繼承了各個超類中許多處理框架大小和位置的方法。如:
dispose方法用於關閉窗口,並回收建立窗口所使用的所有系統資源。
setIconImage方法用於將窗口極小化時的圖標設置爲Image對象。
setTitle方法用於改變標題欄中的文本。
setResizable方法利用一個boolean值肯定框架的大小是否容許用戶改變。
setLocation(x,y)方法將窗口放置在座標爲x,y的位置。
setBounds(x,y,width,height)方法將窗口指定位置,同時設定窗口大小。
可是對於不一樣分辨率的屏幕,框架的大小不一樣,因此應先檢查用戶屏幕的分辨率,並根據其分辨率編寫代碼重置框架的大小。這就須要用到Toolkit類,它包含了不少與本地窗口系統進行交付的方法。先調用靜態方法getDefaultToolkit獲得一個Toolkit對象。而後調用getScreenSize方法,該方法以Dimension對象的形式返回屏幕的大小。Dimension對象用公有實例變量width和height保存屏幕的寬度和高度
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
4.在組件中顯示信息
5.處理2D圖形
6.使用顏色
c.brighter().brighter().brighter()
。7.使用文本特殊字體
8.顯示圖像
1.使用Graphics類的drawImage方法將圖像顯示出來。
2.java.awt.Graphics 1.0
(1)boolean drawImage(Image img,int x,int y,ImageObserver observer)繪製一副非比例圖像。注意:這個調用可能會在圖像尚未繪製完畢就返回。
參數:img 將要繪製的圖像。x 左上角的x座標。y 左上角的y座標。observer 繪製進程中以通告爲目的的對象(可能爲null)。
(2)boolean drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)
繪製一副比例圖像。系統按照比例將圖像放入給定寬和高的區域。注意:這個調用可能會在圖像尚未繪製完畢就返回。
參數:img 將要繪製的圖像。x 左上角的x座標。y 左上角的y座標。width 描述圖像的寬度。height 描述圖像的高度。observer 繪製進程中以通告爲目的的對象(可能爲null)。
(3)void copyArea(int x,int y,int width,int height,int dx,int dy)
拷貝屏幕的一塊區域。
參數:x 原始區域左上角的x座標。y 原始區域左上角的y座標。width 原始區域的寬度。 height 原始區域的高度。dx 原始區域到目的區域的水平距離。dy 原始區域到目的區域的數值距離。
第二部分 實驗部分
實驗1: 導入第9章示例程序,測試程序並進行代碼註釋。
測試程序1:
l 使用JDK命令運行編輯、運行如下三個示例程序,結合運行結果理解程序;
l 掌握Vetor、Stack、Hashtable三個類的用途及經常使用API。
//示例程序1 import java.util.Vector; class Cat { private int catNumber; Cat(int i) { catNumber = i; } void print() { System.out.println("Cat #" + catNumber); } } public class Cats{ public static void main(String[] args){ Vector<Cat> cats= new Vector<Cat>(); for(int i=0; i<7; i++) cats.addElement(new Cat(i)); for(int i=0; i<cats.size(); i++) (cats.elementAt(i)).print(); } } //示例程序2 import java.util.*; public class Stacks { static String[] months={"金","銀","銅","鐵"}; public static void main(String[] args){ Stack<String> stk = new Stack<String> (); for(int i=0; i<months.length; i++) stk.push(months[i]); System.out.println(stk); System.out.println("element 2=" + stk.elementAt(2)); while(!stk.empty()) System.out.println(stk.pop()); } } //示例程序3 import java.util.*; class Counter { int i = 1; public String toString() { return Integer.toString(i); } } public class Statistics { public static void main(String[] args) { Hashtable ht = new Hashtable(); for (int i = 0; i < 10000; i++) { Integer r = new Integer((int) (Math.random() * 20)); if(ht.containsKey(r)) ((Counter)ht.get(r)).i++; else ht.put(r, new Counter()); } System.out.println(ht); } }
實驗運行源代碼爲:
package chart10; //示例程序1 import java.util.Vector; //矢量類包 class Cat { private int catNumber; //Cat類的整型私有變量catNumber Cat(int i) { //Cat構造器 catNumber = i; } void print() { //print方法定義 System.out.println("Cat #" + catNumber); } } public class Cats{ public static void main(String[] args){ Vector<Cat> cats= new Vector<Cat>(); //建立一個Vector<Cat>類對象cats for(int i=0; i<7; i++) //for循環經過Vector<Cat>類對象cats來調用addElement()方法 cats.addElement(new Cat(i)); for(int i=0; i<cats.size(); i++) (cats.elementAt(i)).print(); //經過Vector<Cat>類對象cats來調用elementAt()方法以及Cat類的print()方法 } }
實驗運行結果截圖爲:
程序運行源代碼爲:
package Stacks; //示例程序2 import java.util.*; public class Stacks //堆棧類 { static String[] months={"金","銀","銅","鐵"}; //定義一個字符類數組months[],其中元素爲金、銀、銅、鐵 public static void main(String[] args){ Stack<String> stk = new Stack<String> (); //建立一個Stack<String>類對象stk for(int i=0; i<months.length; i++) stk.push(months[i]); //經過對象名來調用push()方法 System.out.println(stk); System.out.println("element 2=" + stk.elementAt(2)); while(!stk.empty()) //當stk不爲空時,將經過對象名調用pop()方法 System.out.println(stk.pop()); } }
程序運行結果截圖爲:
程序源代碼爲:
package Counter; //示例程序3 import java.util.*; class Counter { //Counter類 int i = 1; //定義一個整型的Counter類變量i public String toString() { //toString()方法 return Integer.toString(i); } } public class Statistics { public static void main(String[] args) { Hashtable ht = new Hashtable(); //建立一個Hashtable類對象ht。Hashtable保存了一批鍵值對 for (int i = 0; i < 10000; i++) { Integer r = new Integer((int) (Math.random() * 20)); //建立一個Integer類對象r,調用Math包的random()方法隨機生成10000個1-20之間的隨機數,強制類型轉換爲int型 if(ht.containsKey(r)) //若是r的鍵值不爲空 ((Counter)ht.get(r)).i++; //將Hashtable類對象ht強制轉換爲Counter類,調用get()方法而後再讓i(r的出現次數)加一 else ht.put(r, new Counter()); //不然Hashtable類對象ht調用put()方法,再建立一個Counter類對象 } System.out.println(ht); //將ht輸出在控制檯上 } }
程序運行結果截圖爲:
測試程序2:
l 使用JDK命令編輯運行ArrayListDemo和LinkedListDemo兩個程序,結合程序運行結果理解程序;
import java.util.*; public class ArrayListDemo { public static void main(String[] argv) { ArrayList al = new ArrayList(); // Add lots of elements to the ArrayList... al.add(new Integer(11)); al.add(new Integer(12)); al.add(new Integer(13)); al.add(new String("hello")); // First print them out using a for loop. System.out.println("Retrieving by index:"); for (int i = 0; i < al.size(); i++) { System.out.println("Element " + i + " = " + al.get(i)); } } } import java.util.*; public class LinkedListDemo { public static void main(String[] argv) { LinkedList l = new LinkedList(); l.add(new Object()); l.add("Hello"); l.add("zhangsan"); ListIterator li = l.listIterator(0); while (li.hasNext()) System.out.println(li.next()); if (l.indexOf("Hello") < 0) System.err.println("Lookup does not work"); else System.err.println("Lookup works"); } }
程序運行源代碼爲:
package ArrayListDemo; import java.util.*; public class ArrayListDemo { public static void main(String[] args) { ArrayList al = new ArrayList(); //建立一個ArrayList類對象al // Add lots of elements to the ArrayList... al.add(new Integer(11)); //經過al調用add()方法添加元素 al.add(new Integer(12)); al.add(new Integer(13)); al.add(new String("hello")); // First print them out using a for loop. System.out.println("Retrieving by index:"); //將Retrieving by index:(按索引搜索)輸出在控制檯上 for (int i = 0; i < al.size(); i++) { //i小於數組類對象al的大小時,輸出i的值 System.out.println("Element " + i + " = " + al.get(i)); } } }
程序運行結果截圖爲:
程序源代碼爲:
package LinkedListDemo; import java.util.*; public class LinkedListDemo { public static void main(String[] argv) { LinkedList l = new LinkedList(); //建立一個LinkedList類的對象l l.add(new Object()); //經過l調用add()方法增長元素 l.add("Hello"); l.add("zhangsan"); ListIterator li = l.listIterator(0); //建立一個ListIterator類的對象li while (li.hasNext()) //這是java的迭代器的用法。使用hasNext()檢查序列中是否還有元素。 System.out.println(li.next()); //使用next()得到序列中的下一個元素。 if (l.indexOf("Hello") < 0) //indexOf檢測若是不存在就會返回Lookup does not work System.err.println("Lookup does not work"); else System.err.println("Lookup works"); } }
程序運行結果截圖爲:
實驗代碼以下:
package linkedList; import java.util.*; /** * This program demonstrates operations on linked lists. * @version 1.12 2018-04-10 * @author Cay Horstmann */ public class LinkedListTest { public static void main(String[] args) { LinkedList<String> a = new LinkedList<String>();//建立一個LinkedList<String>類對象 a.add("Amy"); //經過a調用add()方法添加元素 a.add("Carl"); a.add("Erica"); LinkedList<String> b = new LinkedList<String>();//建立一個LinkedList<String>類對象 b.add("Bob"); //經過b調用add()方法添加元素 b.add("Doug"); b.add("Frances"); b.add("Gloria"); // merge the words from b into a ListIterator<String> aIter = a.listIterator(); //listIterator接口是iterator的子接口 Iterator<String> bIter = b.iterator(); while (bIter.hasNext()) //若是存在訪問的元素,返回ture { if (aIter.hasNext()) aIter.next(); //若是aIter中存在訪問的元素使用next()得到序列中的下一個元素。 aIter.add(bIter.next()); //添加bIter.next()獲得的元素到aIter中 } System.out.println(a); // remove every second word from b bIter = b.iterator(); while (bIter.hasNext()) { bIter.next(); // skip one element if (bIter.hasNext()) //若是bIter中存在訪問的元素使用next()得到序列中的下一個元素。 { bIter.next(); // skip next element 使用next()得到序列中的下一個元素。 bIter.remove(); // remove that element 刪除bIter中的元素 } } System.out.println(b); // bulk operation: remove all words in b from a a.removeAll(b); //刪除b中全部的來自a的元素 System.out.println(a); } }
程序運行結果輸出以下:
實驗2:導入第10章示例程序,測試程序並進行代碼註釋。
測試程序1:
l 運行下列程序,觀察程序運行結果。
import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setBounds(0, 0,300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
掌握GUI頂層窗口建立技術。
package SimpleFrameTest; import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { JFrame frame = new JFrame(); //建立一個JFrame類對象frame, frame.setBounds(0, 0,300, 200); //經過frame來調用setBounds()方法,後面的參數分別是像素最初始位置,以及框架的寬度和長度 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //經過調用setDefaultCloseOperation()方法。可關閉 frame.setVisible(true); //調用setVisible()方法, } }
程序運行輸出截圖爲:
在elipse IDE中調試運行教材407頁程序10-1,結合程序運行結果理解程序;與上面程序對比,思考異同;
掌握空框架建立方法;
瞭解主線程與事件分派線程概念
package sizedFrame; import java.awt.*; import javax.swing.*; /** * @version 1.35 2018-04-10 * @author Cay Horstmann */ public class SizedFrameTest { public static void main(String[] args) { EventQueue.invokeLater(() -> //lambda表達式 { SizedFrame frame = new SizedFrame(); //建立一個SizedFrame類對象frame frame.setTitle("SizedFrame"); //經過frame對象來調用setTitle()方法,來設置標題 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //調用setDefaultCloseOperation()方法來設置取消窗口界面 frame.setVisible(true); //調用setVisible()方法來決定窗口是否可見 }); } } class SizedFrame extends JFrame //建立一個類SizedFrame類來繼承JFrame類 { public SizedFrame() //構造器 { // get screen dimensions Toolkit kit = Toolkit.getDefaultToolkit(); //建立一個Toolkit類對象kit,經過類名來調用getDefaultToolkit()方法 Dimension screenSize = kit.getScreenSize(); //調用getScreenSize()方法來獲得框的大小,返回維度類型 int screenHeight = screenSize.height; int screenWidth = screenSize.width; // set frame width, height and let platform pick screen location setSize(screenWidth / 2, screenHeight / 2); //設置大小 setLocationByPlatform(true); // set frame icon Image img = new ImageIcon("icon.gif").getImage(); //建立一個Image對象來設置灰度 setIconImage(img); } }
實驗輸出截圖爲:
測試程序2:
l 在elipse IDE中調試運行教材412頁程序10-2,結合運行結果理解程序;
l 掌握肯定框架經常使用屬性的設置方法。
實驗源代碼爲:
package simpleFrame; import java.awt.*; import javax.swing.*; /** * @version 1.34 2018-04-10 * @author Cay Horstmann */ public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(() -> //lambda表達式 { SimpleFrame frame = new SimpleFrame(); //建立一個SimpleFrame類對象 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //調用setDefaultCloseOperation()方法來取消窗口 frame.setVisible(true); //調用setVisible()方法決定窗口是否可見 }); } } class SimpleFrame extends JFrame //建立一個SimpleFrame類繼承JFrame類 { private static final int DEFAULT_WIDTH = 300; //定義私有常量DEFAULT_WIDTH和DEFAULT_HEIGHT的值 private static final int DEFAULT_HEIGHT = 200; public SimpleFrame() //SimpleFrame構造器 { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); //設置寬度和長度的大小 } }
實驗輸出結果截圖爲:
測試程序3:
l 在elipse IDE中調試運行教材418頁程序10-3,結合運行結果理解程序;
l 掌握在框架中添加組件;
l 掌握自定義組件的用法。
package notHelloWorld; import javax.swing.*; import java.awt.*; /** * @version 1.34 2018-04-10 * @author Cay Horstmann */ public class NotHelloWorld { public static void main(String[] args) { EventQueue.invokeLater(() -> //lambda表達式 { NotHelloWorldFrame frame = new NotHelloWorldFrame(); //建立一個NotHelloWorldFrame類對象 frame.setTitle("NotHelloWorld"); //經過frame來調用setTitle()方法,來設置標題 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//調用setDefaultCloseOperation()方法取消窗口 frame.setVisible(true); //調用setVisible()方法設置窗口是否可見 }); } } /** * A frame that contains a message panel. */ class NotHelloWorldFrame extends JFrame //建立一個NotHelloWorldFrame類來繼承JFrame類 { public NotHelloWorldFrame() //NotHelloWorldFrame構造器 { add(new NotHelloWorldComponent()); //add()方法添加窗口 pack(); } } /** * A component that displays a message. */ class NotHelloWorldComponent extends JComponent //建立一個NotHelloWorldComponent類繼承JComponent類 { public static final int MESSAGE_X = 75; //私有屬性,常量MESSAGE_X以及MESSAGE_Y 的定義 public static final int MESSAGE_Y = 100; private static final int DEFAULT_WIDTH = 300; //私有屬性,常量DEFAULT_WIDTH以及DEFAULT_HEIGHT 的定義 private static final int DEFAULT_HEIGHT = 200; public void paintComponent(Graphics g) //paintComponent()方法定義來實現繪圖 { g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y); } public Dimension getPreferredSize() //getPreferredSize()獲得維度 { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } }
實驗結果輸出截圖爲:
實驗總結:
(1)這周咱們主要學習了兩個方面的知識,主要學習了有關集合和圖形程序設計的知識。對於我來講相對容易理解的是圖形程序設計部分,而集合相關知識對我來講相對更難一點。此次的實驗沒有太難,
由於此次都是驗證性的實驗,實驗過程中也沒有出現驗證錯誤等問題。固然,經過實驗我才更加深刻的瞭解了程序的邏輯性。
(2)經過此次實驗基礎總結,更加系統的看了一遍書,理解了在老師講解過程當中沒有理解的細微的知識點。