張孝祥java視訊學習筆記(十)
GUI/圖形使用者介面
AWT的基礎知識
GUI全稱是圖形使用者介面,分成兩大類:基本元件(java.awt.componnent)不能放置元件和容器(java.awt.container)可以放置按鈕等元件
程式的GUI部分由AWT執行緒管理(dispose這個方法是將執行緒釋放,將執行程式從記憶體中清除掉)
AWT事件處理
事件:使用者對元件的一個操作稱之為一個事件;
事件源:發生事件的元件就是事件源;呼叫者
事件處理器:某個java類中的負責處理事件的成員方法。
事件分類
按產生事件的物理操作和GUI元件的表現效果進行分類:
MouseEvent
WindowEvent
ActionEvent //使用者的物理操作導致某個元件本身的基本作用發生
事件的性質分類:1低階事件【多個成員方法稱為低階事件】
2語義事件【監聽器中只有一個方法就是語義事件】(關心動作發生不關心怎麼發生)【又稱為高階事件】
事件監聽器(方法都是void類的)
一個事件監聽器物件負責處理一類事件
一類事件的每一種發生情況,分別由事件監聽器物件中的一個方法來具體處理。
在事件源和事件監聽器物件中進行約定的介面類,被稱為事件監聽器介面。
事件監聽器介面類的名稱與事件類的名稱是相對應的。
TestFrame.java import java.awt.*;
public class TestFrame{
public static void main(String[] args){
Frame f = new Frame("www.sina.com.cn");
f.add(new Button("ok"));
f.setSize(300,300);
f.setVisible(true);
f.addWindowListener(new MyWindowListener()); //註冊監聽器
try{
Thread.sleep(5000);
}catch(Exception e){
}
//f.setVisible(false); //隱藏視窗
f.dispose(); //清除視窗
}
}
//MyWindowListener.java //事件監聽器類 (有七個方法)
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;
import java.awt.Window;
public class MyWindowListener implement WindowListener {
public void windowOpened(WindowEvent parm1){
}
public void windowClosing(WindowEvent parm1){ //Closing正想關閉視窗
parm1.getWindow().setVisible(false);
//parm1.getSource() //getSource方法返回發生事件的來源
((Window)parm1.getComponent()).dispose(); //getComponent方法返回發生事件的元件
System.exit(0); //退出程式 }
public void windowClosed(WindowEvent parm1){ //Closed已經關閉視窗 }
public void windowIconified(WindowEvent parm1){}
public void windowDeiconified(WindowEvent parm1){ }
public void windowActivated(WindowEvent parm1){ }
public void windowDeactivated(WindowEvent parm1){ }}
事件介面卡:簡化事件監聽器編寫
使用事件介面卡時的常見問題,解決問題的思路:
-- 是方法沒有被呼叫 ,還是方法中的程式程式碼的執行問題?
-- 是方法名寫錯了,還是沒有註冊事件監聽器?
事件介面卡類的不足之處.JAVA中不允許一個類同時繼承兩個類,如果想用做事件監聽器的類已經繼承了別的類,它就不能再繼承介面卡類,在這種情況下我們就只能使用事件監聽器介面.
靈活設計事件監聽器類
如果要在事件監聽器類中訪問非事件源的其他的GUI元件,程式該如何編寫?
事件處理的多重運用
1.一個事件監聽器物件可以註冊多個事件源
2.在一個事件源上也可以註冊對同一類事件進行處理的多個事件監聽器物件
3.如何知道一個GUI元件倒底能夠觸發哪幾種事件?
4.一個元件上的一個動作可以產生多種不同型別的事件
修改元件的預設事件處理方式
1.只有在一個元件上註冊了某種事件的事件監聽器物件後,元件才會產生相應的事件物件
2.預設的prosessEvent方法呼叫相應的processXXXEvent方法
如果只是想改變其中的幾個事件的處理方式,就要覆蓋那幾個事件的方法,由於不能進入到某個主件processXXXEvent中修改程式程式碼,只有建立一個繼承主件的子類,在子類中覆蓋方法,並用子類建立物件。
3.呼叫enableEvents((long eventsToEnable))方法,可以在即使沒有註冊事件監聽器的情況下,元件也能夠對某些型別的事件進行響應和產生相應的事件物件.
4.
mainFrame.setVisible(true);
btn2.setVisible(false);不能夠順序顛倒因為在主視窗顯示出來前,加在上面的主件是不可顯示狀態,就不能呼叫setVisable();
GUI元件上的圖形操作
GUI元件上的圖形操作
Graphics類與圖形繪製
元件重繪的處理
影象顯示
雙緩衝技術
Graphics類與圖形繪製
Component.getGraphics方法與Graphics類.
Graphics.drawLine(int x1,int y2,int x2,int y2)方法
Graphics.drawString(String str,int x,int y)方法文字顯示在主件上
Graphics.drawString方法的座標引數(左下角的座標不是左上角)
,是連字元;Vector是儲存物件的集合類。
影象顯示(方法要在PAINT方法裡面寫保證在最小化的時候恢復還有影象)
影象顯示
使用Graphics.drawImage(Image img,int x,int y,ImageObserver observer)方法顯示影象。
(Observer 監檢視像建立物件生成的進度;建立IMAGE物件的時候並沒有完全裝載到記憶體,DRAWIMAGE方法也會返回,建立Image內物件的時候,並沒有在影象記憶體中建立資料,只是在需要的時候才去載入影象所需要的資料;如果Image資料中沒有資料的時候,在呼叫DRAWIMAGE方法的時候,就會在記憶體中建立資料
使用Component.getToolkit.getImage(String path)語句獲得Image例項物件。
空指標異常資訊都應該想到物件為null時還要呼叫它的成員方法或成員屬性
視窗顯現是影象沒有顯現一是指定影象的路徑不對而是根本不存在這樣的影象檔案。此時應該進入影象所在的目錄檢視影象是否存在。
雙緩衝技術
步驟:Component.createImage方法建立記憶體Image物件。
在Image物件上進行繪製的結果就成了一幅影象
在Image物件上執行與元件表面同樣的繪製,Image物件中的影象是元件表面內容的複製,當元件重畫時,只需將記憶體中的Image物件在元件上畫出。
在視窗第一次顯示的時候會呼叫PAINT方法,而IMAGE的例項物件還沒有創建出來,而VISIBLE在paint方法之後呼叫會出現空指標出錯所以要先檢測
常用的AWT元件
JAVA的圖形使用者介面最基本的組成部分就是元件,元件是一個可以以圖形化的方式顯示在螢幕上並能與使用者進行互動的物件(按鈕,標籤等),抽象類Component是所有GUI元件的父類,Component類規定了GUI元件的基本特性,這個類中定義的方法實現了作為一個GUI元件所應具有功能;另外還有一個叫做MenuComponent的類,它是用於菜單方面的父類,菜單方面的元件都是MenuComponent的子類.
Canvas
Canvas是具有最基本和最簡單的GUI功能的元件.
Canvas代表螢幕上的一塊空白的矩形區域,程式能夠在這個部件表面繪圖,也能夠捕獲使用者的操作,產生相應的事件.
當要設計自定製的具有GUI功能的元件類時,繼承Canvas將會大大簡化程式設計難度,只需要實現主件特有的外觀和功能的程式碼就可以了。在JAVA中定義自定製的元件外觀,可以覆蓋CANVAS類中的paint和update方法。
選單
一個完整的菜單系統由選單條,選單,和選單項組成
JAVA中與選單相關的類主要有:MenuBar(選單條),Menu(選單),MenuItem(選單項)
具有複選標記的選單項使用CheckboxMenuItem來定義
有子選單的選單選:其實一個menuitem類是menu的子類,此時用menu來定義然後將其子類有menuitem載入進去,並且要對子選單的內容進行檢測(新建一的工作間)(監聽器對動作進行監測)還需要將例項物件加入到相應的事件源中去,如果是一個以上的事件源要處理此時就使用時在事件源中建立一個事件源的例項物件,然後將例項物件載入到事件源的監聽器中
對於能夠發出actionListener事件的主件都能夠呼叫setActionCommand方法
setActionCommand方法的作用.該方法可以為元件關聯一個命令字串,用於指示元件的動作想要執行的命令.不用setActionCommand為元件關聯一個命令字串時,預設的命令字串為選單元件的標題文字.用getActionCommand可以返回命令字串.
(主件不能獨立顯現出來此時需要容器類幫助)
Container
是所有容器類的父類,Container.add方法用於將元件新增到容器中.(Frame就是其中一種容器)
Container也是Component的子類,容器類物件本身就是一個主件,具有主件所有性質,因此也可以作為元件增加到其它容器上.
Dialog與FileDialog類
Dialog類用於產生對話方塊(與框架視窗類似,可以新增其他的主件但是對話方塊沒有選單條不能改變大小,一般用於臨時顯示的視窗,用於顯示提示資訊或則接收使用者的輸入。不能獨立存在必須要有一個上級視窗,上級視窗就是對話方塊的擁有者)
對話方塊的分類:1.模態對話方塊(顯示時不能在其他對話視窗操作,只有關閉後才能操作
2.非模態對話方塊(顯示時可以操作其他框架如記事本)
Dialog類的兩個常用構造方法:
-- public Dialog(Frame owner,String title);預設的是非模態對話方塊
-- public Dialog(Frame owner,String title,boolean modal); //modal引數用於設定模式(模態,非模態)
如果方法中有個物件x,內部類中有個物件x,,外部類中有個物件x,現在在方法中如何訪問物件,內部類用this外部類用方法名加this
FileDialog類是Dialog類的一個子類,能夠產生標準的檔案存取對話方塊:儲存檔案和開啟檔案對話方塊只能在普通文字中應用