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』

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