Java基礎_15 | Java中的圖形用戶界面包AWT使用詳解

1. Java中的AWT包

在Java中, AWT(Abstract Window Toolkit)是用來處理圖形最基本的方式,它可以用來創建Java的圖形用戶界面程序,

AWT包提供:

  • 圖形界面組件:如:窗口、按鈕、菜單等
  • 容器 :是GUI元素的容器,實現組件管理、佈局管理
  • 佈局管理器:用來安排圖形界面組件的位置
  • Graphics:在組件上進行圖形繪製所使用的圖形環境的父類
  • 事件處理對象:用來處理圖形界面組件所觸發的事件

使用:

//引入AWT包中的所有類
import java.awt.*;

2. 創建窗體

使用Frame類可以創建一個帶有標題和邊框的頂層窗口,創建一個窗體的基本方法如下:

  • ① 構造窗體對象
  • ② 設置窗體外觀屬性
  • ③ 設置窗體可見

構造窗體對象

Frame類常用的構造方法有兩個:

Frame();	//構建了一個新的實例 Frame最初是無形的。 
Frame(String title);	//構建一個新 Frame最初無形對象的指定標題

修改窗體外觀

修改窗體外觀屬性的方法主要有:

void setTitle(String title); 			//設置窗口中標題欄的文字。
void setResizable(boolean resizable);	// 設置用戶是否可以改變框架大小
void dispose();							//關閉窗口,並回收該窗口的所有資源
void setLocation(int x, int y);			//設置組件位置
void setSize(int width, int height);	//設置組件的大小
void setBackground(Color bgColor);		//設置此窗口的背景顏色 
void setBounds(int x, int y, int width, int height);	//重新調整組件的位置和大小

設置窗體可見

窗體默認是不可見的,在設置完窗體外觀屬性後,設置窗體可見的方法如下:

void setVisible(boolean b);

示例代碼如下:

import java.awt.*;

public class AWTDemo01 {
    public static void main(String[] args) {
        Frame mFrame = new Frame("Hello World");
        mFrame.setLocation(500,500);
        mFrame.setSize(300,200);
        mFrame.setBackground(Color.darkGray);
        mFrame.setVisible(true);
    }
}

運行之後的窗體如下:

此時窗體沒有添加事件處理代碼,所以不能直接關閉,需要強制關閉!

3. 添加組件

AWT包中提供瞭如下常用組件:

  • 標籤(Label類)
  • 按鈕(Button)
  • 單行文本(TextField)
  • 多行文本(TextArea)
  • 單選框(CheckboxGroup)
  • 複選框(Checkbox)
  • 下拉菜單(Choice)
  • 對話框(Dialog)
  • 文件對話框(FileDialog)

示例代碼如下:

import java.awt.*;

public class AWTDemo01 {
    public static void main(String[] args) {
        Frame mFrame = new Frame("Hello World");
        mFrame.setLocation(500,500);
        mFrame.setSize(300,200);

        //向窗體中添加一個按鈕
        Button btn1 = new Button("Click me");
        mFrame.add(btn1);

        mFrame.setVisible(true);
    }
}

運行之後效果如下,可以看到,默認添加進去的按鈕會充滿整個窗體的界面:

4. 容器和佈局管理器的使用

容器

容器是圖形用戶界面中可以容納其他組件的特殊組件,一個容器中可以容納一個或多個組件,還可以容納別的容器,窗體就是一個典型的容器。

容器類(Container類)是從Component類派生來的,另外還有一些派生的典型容器包括: Panel,ScrollPane,Window, Frame等。

Panel是在圖形界面繪製中最常用的容器,它的構造方法如下:

Panel() ;		//使用默認佈局管理器創建一個新面板。  
Panel(LayoutManager layout) ;		//創建一個新的面板與指定的佈局管理器。  

設置容器外觀屬性的方法和設置窗體的方法類似,示例代碼如下:

import java.awt.*;

public class AWTDemo01 {
    public static void main(String[] args) {
        Frame mFrame = new Frame("Hello World");
        mFrame.setLocation(500,500);
        mFrame.setSize(300,200);

        Panel pn1 = new Panel();
        Panel pn2 = new Panel();
        Panel pn3 = new Panel();
        Panel pn4 = new Panel();

        pn1.setBackground(Color.blue);
        pn2.setBackground(Color.cyan);
        pn3.setBackground(Color.pink);
        pn4.setBackground(Color.magenta);

        pn1.setBounds(0,0,150,100);
        pn2.setBounds(150,0,150,100);
        pn3.setBounds(0, 100,150,100);
        pn4.setBounds(150,100,150,100);

        mFrame.add(pn1);
        mFrame.add(pn2);
        mFrame.add(pn3);
        mFrame.add(pn4);

        mFrame.setVisible(true);
    }
}

運行結果如下:

佈局管理器(重點)

Java.awt包中共定義了5種佈局類,每種佈局都對應一種佈局,分別是:

  • FlowLayout
  • BorderLayout
  • CardLayout
  • GridLayout
  • GridBagLayout

FlowLayout(流式佈局)

佈局規則:將容器中的組件按照加入的先後順序從左向右排列,如果一行排滿轉下一行繼續,每行均採取居中排列。

示例代碼:

import java.awt.*;

public class AWTDemo02 {
    public static void main(String[] args) {
        Frame mFrame = new Frame("FlowLayoutTest");
        mFrame.setLocation(500,500);
        mFrame.setSize(300,200);

        Panel buttonPanel=new Panel();

        for(int i = 0; i < 20; i++) {
            Button btn = new Button("btn"+i);
            buttonPanel.add(btn);
        }

        mFrame.add(buttonPanel);
        mFrame.setVisible(true);
    }
}

運行效果如下:

BorderLayout(邊界式佈局)

佈局規則:把容器內的空間劃分爲東、西、南、北、中5個區域分別用英文的East、 West、 South、 North、Center表示,向容器中加入每個組件都要指明在容器的區域。

示例代碼:

import java.awt.*;

public class AWTDemo03 {
    public static void main(String[] args) {
        Frame mFrame = new Frame("BorderLayoutTest");
        mFrame.setLocation(500,500);
        mFrame.setSize(500,500);

        Panel testPanel=new Panel();
        //設置佈局管理器
        testPanel.setLayout(new BorderLayout());

        Button btnCenter = new Button("Center");
        Button btnEast = new Button("East");
        Button btnWest = new Button("West");
        Button btnSouth = new Button("South");
        Button btnNorth = new Button("North");

        testPanel.add(btnCenter, "Center");
        testPanel.add(btnEast,"East");
        testPanel.add(btnWest,"West");
        testPanel.add(btnSouth, "South");
        testPanel.add(btnNorth, "North");

        mFrame.add(testPanel);
        mFrame.setVisible(true);
    }
}

演示效果如下:

CardLayout(卡片式佈局)

佈局規則:使用CardLayout的容器可以容納多個組件,但是實際上同一時刻容器只能從這些組件中選出一個來顯示,就像一疊“撲克牌”每次只能顯示最上面一張一樣,這個被顯示的組件將佔據所有的容器空間,依次排序。

示例代碼:

import java.awt.*;

public class AWTDemo04 {
    public static void main(String[] args) {
        Frame mFrame = new Frame("CardLayoutTest");
        mFrame.setLocation(500,500);
        mFrame.setSize(300,200);

        Panel pnCard = new Panel();
        //設置佈局管理器
        pnCard.setLayout(new CardLayout());
        Button btn1 = new Button("btn1");
        Button btn2 = new Button("btn1");
        Button btn3 = new Button("btn2");

        pnCard.add(btn1);
        pnCard.add(btn2);
        pnCard.add(btn3);

        Panel pnBtn = new Panel();
        Button btnNext = new Button("Next");
        Button btnPrev = new Button("Prev");
        pnBtn.add(btnNext);
        pnBtn.add(btnPrev);

        mFrame.add(pnCard,"Center");
        mFrame.add(pnBtn,"South");
        
        mFrame.setVisible(true);
    }
}

效果如下:

GridLayout(方格式佈局)

佈局規則:把容器劃分成若干行乘若干列的網格區域,組件就位於這些劃分出來的小格中。

示例代碼:

import java.awt.*;

public class AWTDemo05 {
    public static void main(String[] args) {
        Frame mFrame = new Frame("GridLayoutTest");
        mFrame.setLocation(500,500);
        mFrame.setSize(300,200);

        Panel buttonPanel=new Panel();
        //設置佈局管理器,重點
        buttonPanel.setLayout(new GridLayout(4,5));

        for(int i = 0; i < 20; i++) {
            Button btn = new Button("btn"+i);
            buttonPanel.add(btn);
        }

        mFrame.add(buttonPanel);
        mFrame.setVisible(true);
    }
}

效果如下:

GridBagLayout

佈局規則:使用行(列)型盒式佈局的容器將組件排列在一行(列),組件按加入的先後順序從左(上)向右(下)排列,容器的兩端是剩餘的空間。

示例代碼如下:

import java.awt.*;

public class AWTDemo05 {
    public static void main(String[] args) {
        Frame mFrame = new Frame("GridLayoutTest");
        mFrame.setLocation(500,500);
        mFrame.setSize(300,200);

        Panel panel1=new Panel();
        //設置佈局管理器
        panel1.setLayout(new GridBagLayout());

        GridBagConstraints panel2 =new GridBagConstraints();
        panel2.fill=GridBagConstraints.BOTH;
        panel2.weightx=1;
        panel2.weighty=1;

        panel2.gridwidth=2;
        panel2.gridx=0;
        panel1.add(new Button("No.1"),panel2);
        panel2.gridx=2;
        panel2.gridwidth=1;
        panel2.gridheight=2;
        panel1.add(new Button("No.2"),panel2);
        panel2.gridx=0;
        panel2.gridheight=1;
        panel1.add(new Button("No.3"),panel2);
        panel2.gridx=1;
        panel1.add(new Button("No.4"),panel2);

        mFrame.add(panel1);
        mFrame.setVisible(true);
    }
}

效果如下:

5. Java中的事件處理機制

爲什麼需要事件處理機制

  • 程序執行效率高
  • 架構清晰明瞭
  • Java虛擬機自動監測事件和調用處理函數,程序員只需要關心會發生哪些事件?如何處理這些事件即可。

Java中的事件處理機制

Java中的事件處理機制架構如圖所示:

  • 事件源(EventSource) :人機交互中事件的來源,通常是Java圖形包中組件;
  • 事件(ActionEvent):事件源產生的交互內容,通常是在 java.awt.event包中定義的類;
  • 事件監聽器(ActionListener):接收事件並進行處理, 由程序員編寫,對應處理所監聽事件源產生的事件;
  • 監聽器接口:編寫“事件監聽器”的“規定” (抽象方法),必須在監聽器類中實現這些方法完成事件處理;
  • 監聽器註冊:將事件監聽器對象綁定到事件源,進行監聽;

Java中事件處理機制如何實現

① 實現事件對應的監聽器

實現方法:

class <自己的監聽器名稱> implements <監聽器名稱> {
	//抽象方法實現
	public void actionPerformed( ) {
		/** 按鈕事件所進行的具體工作 **/
	}
}

常用事件監聽器類:
、

② 註冊監聽器到事件源

綁定方法:每個組件都提供了用於綁定監聽器的方法,通過觀察 “addxxxListener” 方法的名稱,可以很容易地知道其能夠處理的事件類型。

示例代碼:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/* 自己實現按鈕監聽器 */
class BtnListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("按鈕按下啦!");
    }
}

public class AWTDemo06 {
    public static void main(String[] args) {
        Frame mFrame = new Frame("Hello World");
        mFrame.setLocation(500,500);
        mFrame.setSize(300,200);

        Button btn = new Button("Click me");
        mFrame.add(btn);

        /* 註冊監聽器 */
        btn.addActionListener(new BtnListener());

        mFrame.setVisible(true);
    }
}

效果如下:

接收更多精彩文章及資源推送,歡迎訂閱我的微信公衆號:『mculover666』

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章