Java-GUI编程(AWT)

目录

 

AWT

一、AWT介绍

二、组件和容器(Component和Container)

2.1.Frame

2.2.Panel

三、布局管理器

3.1.第一种布局管理器——FlowLayout

3.2.第二种布局管理器——BorderLayout

3.3.第三种布局管理器——GridLayout(表格布局管理器)

四、事件监听

五、TextField事件监听

六、内部类

七、Graphics 类

八、鼠标事件适配器

九、window事件

十、键盘响应事件


AWT

一、AWT介绍

  • AWT(Abstract Window Toolkit)包括了很多类和接口,用于Java Application的GUI(GraphicsUser Interface 图形用户界面)编程。
  • GUI的各种元素(如:窗口,按钮,文本框等)由Java类来实现。
  • 使用AWT所涉及的类一般在Java.AWT包及其子包中。
  • Container和Component是AWT中的两个核心类。

二、组件和容器(Component和Container)

2.1.Frame

package com.kou;
import java.awt.*;
//学习JAVA的GUI编程编写的第一个图形界面窗口
public class TestFrame {
public static void main(String[] args) {
//这里只是在内存里面创建了一个窗口对象 还不能真正显示出来然我们看到
Frame frame = new Frame("我的第一个JAVA图形界面窗口");
//设置窗体的背景颜色
frame.setBackground(Color.blue);
//设置窗体是否可见
//要想看到在内存里面创建出来的窗口对象
//必须调用setVisble()方法
//并且把参数true传入才能看得见窗体
//如果传入的参数是false
//那么窗体也是看不见的
frame.setVisible(true);
//设置窗体的初始大小
frame.setSize(400,400);
//设置窗体出现时的位置,如果不设置则默认在左上角(0,0)位置显示
frame.setLocation(200,200);
// 设置窗体能否被改变大小
// 设置为false后表示不能改变窗体的显示大小
// 这里将窗体显示的大小设置为200X200
// 那么窗体的显示只能是这个大小了,不能再使用鼠标拖大或者缩小
frame.setResizable(false);
}
}

2.2.Panel

package com.kou;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class TestPanel {
public static void main(String[] args) {
Frame frame = new Frame("JAVA Frame With Panel");
Panel panel = new Panel(null);
frame.setLayout(null);
//这里设置的坐标(300,300)是相对于整个屏幕的
frame.setBounds(300,300,500,500);
//设置背景颜色时使用三基色(红,绿,蓝)的比例来调配背景色
frame.setBackground(new Color(0,0,102));
//这里设置的坐标(50,50)是相对于Frame窗体的
panel.setBounds(50,50,400,400);
panel.setBackground(new Color(204,204,255));
//把Panel容器装入到Frame容器中,使其能在Frame窗口中显示出来
frame.add(panel);
frame.setVisible(true);
//解决关闭问题
frame.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
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) {
}
});
}
}

三、布局管理器

3.1.第一种布局管理器——FlowLayout

package com.kou;
import java.awt.*;
public class TestFlowLayout {
public static void main(String[] args) {
Frame frame = new Frame("FlowLayout");
//使用Button类创建按钮
// 按钮类的其中一个构造方法:Button(String label) label为按钮显示的文本
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
// setLayout方法的定义:public void setLayout(LayoutManager mgr)
// 使用流水(Flow)线般的布局
frame.setLayout(new FlowLayout());
// 使用了布局管理器FlowLayout,这里的布局采用默认的水平居中模式
// frame.setLayout(new FlowLayout(FlowLayout.LEFT));
// 这里在布局的时候使用了FlowLayout.LEFT常量,这样就将按钮设置为左对齐
// frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
//这里在布局的时候使用了FlowLayout.RIGHT常量,这样就将按钮设置为右对齐
frame.setSize(200,200);
frame.add(button1); // 把创建出来的按钮放置到Frame窗体中
frame.add(button2); // 这里并没有设置按钮的大小与位置
frame.add(button3); // 设置按钮的大小与位置都是由布局管理器来做的
frame.setVisible(true);
}
}

3.2.第二种布局管理器——BorderLayout

package com.kou;
import java.awt.*;
public class TestBorderLayout {
public static void main(String[] args) {
Frame frame = new Frame("TestBorderLayout");
Button buttonEast = new Button("East");
Button buttonWest = new Button("West");
Button buttonSouth = new Button("South");
Button buttonNorth = new Button("North");
Button buttonCenter = new Button("Center");
//把按钮放置到Frame窗体时按照东西南北中五个方向排列好,推荐使用这种方式去排列窗体
元素
//这样容易检查出错误 因为这样写如果写错了编译器会提示出错
frame.add(buttonEast,BorderLayout.EAST);
frame.add(buttonWest,BorderLayout.WEST);
frame.add(buttonSouth,BorderLayout.SOUTH);
frame.add(buttonNorth,BorderLayout.NORTH);
frame.add(buttonCenter,BorderLayout.CENTER);
//也可以使用这样的方式排列按钮 在把按钮放置到Frame窗体时使用方向定位的字符串指定
按钮的放置位置
//这种使用方向定位的字符串指定按钮的放置方式不推荐使用 一旦写错了方向字符串就不好
检查出来
//因为即使是写错了仍然可以编译通过
/*
frame.add(buttonEast,"EAST");
frame.add(buttonWest,"West");
frame.add(buttonSouth,"South");
frame.add(buttonNorth,"North");
frame.add(buttonCenter,"Center");
*/
frame.setSize(200,200);
frame.setVisible(true);
}
}

3.3.第三种布局管理器——GridLayout(表格布局管理器)

package com.kou;
import java.awt.*;
public class TestGridLayout {
public static void main(String[] args) {
Frame frame = new Frame("TestGridLayout");
Button btn1 = new Button("btn1");
Button btn2 = new Button("btn2");
Button btn3 = new Button("btn3");
Button btn4 = new Button("btn4");
Button btn5 = new Button("btn5");
Button btn6 = new Button("bnt6");
// 把布局划分成3行2列的表格布局形式
frame.setLayout(new GridLayout(3,2));
frame.add(btn1);
frame.add(btn2);
frame.add(btn3);
frame.add(btn4);
frame.add(btn5);
frame.add(btn6);
// Frame.pack()是JAVA语言的一个函数
// 这个函数的作用就是根据窗口里面的布局及组件的preferredSize来确定frame的最佳
大小。
frame.pack();
frame.setVisible(true);
}
}

四、事件监听

package com.kou;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestActionEvent2 {
public static void main(String[] args) {
Frame frame = new Frame("TestActionEvent");
Button btn1 = new Button("start");
Button btn2 = new Button("stop");
//创建监听对象
MyMonitor monitor = new MyMonitor();
//一个监听对象同时监听两个按钮的动作
btn1.addActionListener(monitor);
btn2.addActionListener(monitor);
//设置btn2的执行单击命令后的返回信息
btn2.setActionCommand("GameOver");
frame.add(btn1,BorderLayout.NORTH);
frame.add(btn2,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
}
class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//使用返回的监听对象e调用getActionCommand()方法获取两个按钮执行单击命令后的返
回信息
//根据返回信息的不同区分开当前操作的是哪一个按钮,btn1没有使用
setActionCommand()方法设置
//则btn1返回的信息就是按钮上显示的文本
System.out.println("a button has been pressed,"+"the relative info
is:\n"
+e.getActionCommand());
}
}

五、TextField事件监听

JAVA里面的经典用法:在一个类里面持有另外一个类的引用

package com.kou2;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestMath1 {
public static void main(String[] args) {
new Calculator2().launchFrame();
}
}
//做好计算器的窗体界面
class Calculator2 extends Frame {
//把设计计算器窗体的代码封装成一个方法
TextField num1, num2, num3;
public void launchFrame() {
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(15);
Label lblPlus = new Label("+");
Button btnEqual = new Button("=");
btnEqual.addActionListener(new MyMonitorbtnEqual(this));
setLayout(new FlowLayout());
add(num1);
add(lblPlus);
add(num2);
add(btnEqual);
add(num3);
pack();
setVisible(true);
}
}
//这里通过取得Calculator2类的引用,然后使用这个引用去访问Calculator2类里面的成员变量
//这种做法比上一种直接去访问Calculator2类里面的成员变量要好得多
//因为现在不需要知道 Calculator2类里面有哪些成员变量了,
//现在要访问Calculator2类里面的成员变量,直接使用 Calculator2类对象的引用去访问即可
//这个Calculator2类的对象好比是一个大管家, 而我告诉大管家,我要访问Calculator2类里面的
那些成员变量,
//大管家的引用就会去帮我找,不再需要我自己去找了。
//这种在一个类里面持有另一个类的引用的用法是一种非常典型的用法
//使用获取到的引用就可以在一个类里面访问另一个类的所有成员了
class MyMonitorbtnEqual implements ActionListener {
Calculator2 calculator2 = null;
public MyMonitorbtnEqual(Calculator2 calculator2) {
this.calculator2 = calculator2;
}
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(calculator2.num1.getText());
int n2 = Integer.parseInt(calculator2.num2.getText());
calculator2.num3.setText("" + (n1 + n2));
calculator2.num1.setText("");
calculator2.num2.setText("");
}
}

六、内部类

  • 可以方便的访问包装类的成员
  • 可以更清楚的组织逻辑,防止不应该被其他类 访问的类 进行访问
package com.kou2;
import java.awt.*;
import java.awt.event.*;
public class TestMath3 {
public static void main(String args[]) {
new MyMathFrame().launchFrame();
}
}
class MyMathFrame extends Frame {
TextField num1, num2, num3;
public void launchFrame() {
num1 = new TextField(10);
num2 = new TextField(15);
num3 = new TextField(15);
Label lblPlus = new Label("+");
Button btnEqual = new Button("=");
btnEqual.addActionListener(new MyMonitor());
setLayout(new FlowLayout());
add(num1);
add(lblPlus);
add(num2);
add(btnEqual);
add(num3);
pack();
setVisible(true);
}
/*
* 这个MyMonitor类是内部类,它在MyFrame类里面定义 MyFrame类称为MyMonitor类的包
装类
*/
/*
* 使用内部类的好处:
* 第一个巨大的好处就是可以畅通无阻地访问外部类(即内部类的包装类)的所有成员变量和方法
* 如这里的在MyFrame类(外部类)定义的三个成员变量num1,num2,num3,
* 在MyMonitor(内部类)里面就可以直接访问
* 这相当于在创建外部类对象时内部类对象默认就拥有了一个外部类对象的引用
*/
private class MyMonitor implements ActionListener {
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText("" + (n1 + n2));
num1.setText("");
num2.setText("");
}
}
}

内部类带来的巨大好处是:
1. 可以很方便地访问外部类定义的成员变量和方法
2. 当某一个类不需要其他类访问的时候就把这个类声明为内部类。

七、Graphics 类

每个Component都有一个paint(Graphics g)用于实现绘图目的,每次重画该Component时都自动调用paint方法。
Graphics类中提供了许多绘图方法,如:

 

DrawCurve 画曲线。

DrawEllipse 画椭圆。

DrawImage 画图像。

DrawLine 画线。
DrawPath 通过路径画线和曲线。

DrawPie 画饼形。

DrawPolygon 画多边形。

DrawRectangle 画矩形。

DrawString 绘制文字。

FillEllipse 填充椭圆。

FillPath 填充路径。

FillPie 填充饼图。

FillPolygon 填充多边形。

FillRectangle 填充矩形。

FillRectangles 填充矩形组。

FillRegion 填充区域。

八、鼠标事件适配器

  • 抽象类java.awt.event.MouseAdapter实现了MouseListener接口,可以使用其子类作为MouseEvent的监听器,只要重写其相应的方法即可。
  • 对于其他的监听器,也有对应的适配器。
  • 适用适配器可以避免监听器定义没有必要的空方法。

九、window事件

package com.kou3;
import java.awt.*;
import java.awt.event.*;
public class TestWindowClose{
public static void main(String args[]){
new WindowFrame("关闭WindowFrame");
}
}
class WindowFrame extends Frame{
public WindowFrame(String s){
super(s);
setBounds(200,200,400,300);
setLayout(null);
setBackground(new Color(204,204,255));
setVisible(true);
this.addWindowListener(new WindowMonitor());
/*监听本窗体的动作,把所有的动作信息封装成一个对象传递到监听类里面*/
this.addWindowListener(
/*在一个方法里面定义一个类,这个类称为局部类,也叫匿名的内部类,
这里的{……代码……}里面的代码很像一个类的类体,只不过这个类没有名字,所以叫匿名类
在这里是把这个匿名类当成WindowAdapter类来使用,语法上这样写的本质意义是相当于这
个匿名类
从WindowAdapter类继承,现在new了一个匿名类的对象出来然后把这个对象当成
WindowAdapter来使用
这个匿名类出了()就没有人认识了*/
new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
System.exit(-1);
}
}
);
}
/*这里也是将监听类定义为内部类*/
class WindowMonitor extends WindowAdapter{
/*WindowAdapter(Window适配器)类实现了WindowListener监听接口
重写了WindowListener接口里面的所有方法
如果直接使用自定义WindowMonitor类直接去
实现WindowListener接口,那么就得要重写WindowListener接口
里面的所有方法,但现在只需要用到这些方法里面的其中一个方法
所以采用继承实现WindowListener监听接口的一个子类
并重写这个子类里面需要用到的那个方法即可
这种做法比直接实现WindowListener监听接口要重写很多个用不到的方法要简洁方便得多
*/
/*重写需要用到的windowClosing(WindowEvent e)方法*/
public void windowClosing(WindowEvent e){
setVisible(false);/*将窗体设置为不显示,即可实现窗体关闭*/
System.exit(0);/*正常退出*/
}
}
}

十、键盘响应事件

键盘响应事件——KeyEvent

package com.kou3;
import java.awt.*;
import java.awt.event.*;
public class TestKeyEvent{
public static void main(String args[]){
new KeyFrame("键盘响应事件");
}
}
class KeyFrame extends Frame{
public KeyFrame(String s){
super(s);
setBounds(200,200,400,300);
setLayout(null);
setVisible(true);
addKeyListener(new KeyMonitor());
}
/*把自定义的键盘的监听类定义为内部类
这个监听类从键盘适配器KeyAdapter类继承
从KeyAdapter类继承也是为了可以简洁方便
只需要重写需要用到的方法即可,这种做法比
直接实现KeyListener接口要简单方便,如果
直接实现KeyListener接口就要把KeyListener
接口里面的所有方法重写一遍,但真正用到的
只有一个方法,这样重写其他的方法但又用不到
难免会做无用功*/
class KeyMonitor extends KeyAdapter{
public void keyPressed(KeyEvent e){
int keycode = e.getKeyCode();
/*使用getKeyCode()方法获取按键的虚拟码*/
/*如果获取到的键的虚拟码等于up键的虚拟码
则表示当前按下的键是up键
KeyEvent.VK_UP表示取得up键的虚拟码
键盘中的每一个键都对应有一个虚拟码
这些虚拟码在KeyEvent类里面都被定义为静态常量
所以可以使用“类名.静态常量名”的形式访问得到这些静态常量*/
if(keycode == KeyEvent.VK_UP){
System.out.println("你按的是up键");
}
}
}
}
/*键盘的处理事件是这样的:每一个键都对应着一个虚拟的码,
当按下某一个键时,系统就会去找这个键对应的虚拟的码,以此来确定当前按下的是那个键
*/

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寇大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值