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』。