GUI
GUI組件可以分為兩類:基本組件和容器。容器是一種特殊的組件。
程序的GUI線程由AWT線程管理,并不是主線程結束窗口就會消失。在多線程中如果有一個前臺線程沒有結束,改程序就不可能結束。
1. ATW時間處理:
1.1、 事件處理機制: 事件:用戶對組件的一個操作,稱之為一個事件。
事件源:發生事件的組件就是事件源。
事件處理器:某個java類中的負責處理事件的成員方法。
一個事件監聽器對象負責處理一類事件。 一類事件的每一種發生情況,分別由事件監聽器對象中的一個方法來具體處理。 在事件源和事件監聽器對象中進行約定的接口類,被稱為事件監聽器接口。 事件監聽器接口類的名稱與事件類的名稱是對應的,例如:MouseEvent事件類的監聽接口名為MouseListener。
處理發生在某個GUI組件上的XxxEvent事件的某種情況,其事件處理的通用程序編寫流程:
a. 編寫一個實現了XxxListener接口的事件監聽器類。
b. XxxListener類中的用于處理該事件情況的方法中,編寫處理代碼。
c. 調用組件的addXxxListener方法,將類XxxListener創建的實力對象注冊到GUI組件上。
class YourWindowListern extends WindowAdapter{
//由于適配器中的方法太簡單,不能滿足業務的需求所以要對對應的處理方法進行覆蓋
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
e.getWindow().dispose();
System.exit(0);
/*
* 如果一個方法不是自己調用,而是由java內部自己調用,如果出現與結果不一致的情況,要查看此方法是否被調用
* */
}
}
class MyWindownListern implements WindowListener{
@Override public void windowOpened(WindowEvent e) {}
@Override
public void windowClosing(WindowEvent e) {
e.getWindow().setVisible(false); //區別兩個get方法
((Window) e.getComponent()).dispose();
//e.get 得到發生事件的事件源
System.exit(0);
}
@Override public void windowClosed(WindowEvent e) {}
@Override public void windowIconified(WindowEvent e) {}
@Override public void windowDeiconified(WindowEvent e) {}
@Override public void windowActivated(WindowEvent e) {}
@Override public void windowDeactivated(WindowEvent e) {}
}
class ButtonClose implements ActionListener{
private Frame f = null;
public ButtonClose(Frame f) {
this.f = f;
}
@Override
public void actionPerformed(ActionEvent e) {
this.f.dispose();
//System.exit(0);
}
}
public class TestFrame {
public static void main(String[] args) {
/*Frame f = new Frame("www.cjt.org");
f.add(new Button("ok"));
f.setSize(300, 300);
f.setVisible(true);
// f.addWindowListener(new MyWindownListern()); //將事件注冊到f對象上
f.addWindowListener(new YourWindowListern());*/
/* try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
f.dispose(); //釋放窗口對象
*/ //f.setVisible(false); //設置不可見但f對象仍然在內存對象中
//3. ButtonClose
Frame f = new Frame("www.cjt.org");
f.setSize(300, 200);
Button b = new Button("close");
f.add(b);
f.setVisible(true);
b.addActionListener(new ButtonClose(f));
}
}
1.2、事件分類: 按產生事件的物理操作盒GUI組件的表現效果進行分型: MouseEvent, WindowEvent, ActionEvent ......。
1.3 事件適配器: 事件適配器類:事件監聽器接口的最簡單實現類。 用事件適配器來處理事件,可以簡化事件監聽器的編寫。
1.4 靈活設計事件監聽器類: 如果在事件監聽器類中要訪問非事件源的其他GUI組件,程序該如何編寫。(eg:單機button讓窗口關閉)
public class TestFrame implements ActionListener{
private Frame f = new Frame("www.cjt.org"+i);
public static int i = 0;
public TestFrame(){
i++;
}
public void init(){
Button b = new Button("close");
f.setSize(300, 200);
f.add(b);
f.setVisible(true);
b.addActionListener(this/*new TestFrame()*/);
}//面向對象編程思想:腦海中是內存中的一個個對象,通過調用方法之后對象狀態發生某種變化
public static void main(String[] args) {
TestFrame t = new TestFrame();
t.init();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("***"+i);
f.dispose();
//System.exit(0);
}
}
1.4 事件處理的多重運用:
用戶的一個操作在觸發了低級事件的同時可能也會處罰語義(高級)事件,此時我們就需要合理的選擇要處理的事件監聽器類型。 eg:用鼠標點擊按鈕,既觸發了鼠標事件也觸發了按鈕本身所代表的事件,程序應該根據業務的需要選擇對事件進行處理,或者兩個都進行處理。如果按鈕被點擊后程序除了要執行按鈕所對應功能外,還希望鼠標按下之后按鈕的標題改變鼠標釋放時候又恢復,這樣就需要注冊兩個事件處理器。一般來說只需要對語義計算進行處理,而不需要對引發該語義事件的低級事件。
1.5修改組件的默認事件處理
總結
- 上一篇: PPPoE(以太网上的点对点协议)
- 下一篇: Docker基础九(Registry 私