1、概述
(1)GUI:图形用户接口(GraphicalUser Interface),即用图形的方式,来显示计算机的界面,这样更方便更直观。
(2)JAVA中为GUI提供的对象都在java.Awt和javax.Swing两个包中
-java.Awt包:AbstractWindow Toolkit(抽象窗口工具包),需要调用本地系统方法实现功能,属重量级控件。
-java.Swing包:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由JAVA实现,增加了移植性,属轻量级控件。
(3)Container:为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。
2、布局管理器
(1)容器中的组件的排放方式就是布局。
(2)常见的布局管理器:
-FlowLayout(流式布局管理器):组件按从左到右的顺序排列,这是Panel组件默认的布局管理器
-BorderLayout(边界布局管理器):组件按东、南、西、北、中的位置排放,默认放置在中。
(3)GridLayout(网格布局管理器):组件按规则的矩阵排放。
(4)GridBagLayout(网格包布避管理器):组件按非规则的矩阵排放。
3、 Component类
(1)Component类是一个抽象类,是与菜单不相关的 Abstract Window Toolkit 组件的抽象超类,是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。
4、Container类
(1)Container类是Component类的一个子类,是一个可包含其他 AWT 组件的容器。
(2)add方法:该方法可以将指定组件追加到Container容器的尾部。
5、Frame类
(1)Frame
是
是带有标题和边框的顶层窗口。其默认布局为BorderLayout。
(2)方法:
-Frame():构造一个最初不可见的 Frame
新实例。
-Frame(String title):构造一个新的、最初不可见的、具有指定标题的 Frame
对象。
-void setVisible(Booleanb):根据参数 b
的值显示或隐藏此组件。
-void setSize(intwid,int hei):调整组件的大小,使其宽度为wid
,高度为 hei
,单位是像素。
-void setLocation(intx,int y):通过此组件父级坐标空间中的x
和y
参数来指定新位置的左上角。
-voidsetLayout(LayoutManager mgr):设置此容器的布局管理器。
-voidsetTitle(String title):此窗体的标题设置为指定的字符串。
(3)创建图形化界面步骤:
-创建frame窗体。
-对窗体进行基本设置,如大小,位置,布局。
-定义组件。
-将组件通过窗体的add方法添加到窗体中。
-让窗体显示,通过setVisible(true)。
(4)示例:
import java.awt.*;
public class AwtDemo
{
public static void main(String[] args)
{
//创建一个窗体
Frame f=new Frame("myframe");
//设置窗体的大小
f.setSize(500,400);
//调整窗体的位置
f.setLocation(300,200);
//设置窗体的布局管理器
f.setLayout(new FlowLayout());
//创建一个按钮
Button b=new Button("mybutton");
//将按钮添加到窗体中
f.add(b);
//设置窗体为可见
f.setVisible(true);
}
}
6、事件监听机制
(1)事件监听机制组成:
-事件源(组件):即awt包或swing包中的好运些图形界面组件。
-事件(Event):每一个事件源都有自已特有的对应事件和共性事件。
-监听器(Listener):将可以触发某一个事件的动作都已经封装到了监听器中。
-事件处理:引发事件后处理方式。
事件源、事件和监听器在JAVA中都已经定义好了,直接获取其对象来用就可以了,我们要做的就是对产生的动作进行处理。
(2)事件监听机制流程图
用户对组件的操作就是一个事件,那么产生事件的组件就是事件源,接收并处理事件,与用户进行交互的行为就是事件处理器,这些处理方式都封装在监听器中。
7、窗体事件
(1)要处理窗体事件需要添加窗口监听器以监听窗口事件,可以通过addWindowListener(WindowListener l)方法添加一个窗口监听器。
(2)WindowListener:是一个接口,用于接收窗口事件的侦听器。旨在处理窗口事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类WindowAdapter
(仅重写所需的方法)。
(3)WindowAdapter
:是一个抽象类,是
接收窗口事件的抽象适配器类,该类实现
WindowListener接口,并覆盖了该接口的所有方法,且将方法覆盖为空。此类存在的目的是方便创建侦听器对象。扩展此类可创建WindowEvent
侦听器并为所需事件重写该方法。所在在创建窗口监听器时不需要去实现WindowListener接口且覆盖该接口的所有方法,只需继承WindowAdapter类并复写其中所需要的方法即可。
(4)示例,当点击窗口关闭按钮时关闭窗口
import java.awt.*;
import java.awt.event.*;
public class AwtDemo2
{
public static void main(String[] args)
{
//创建一个窗体
Frame f=new Frame("myframe");
//设置窗体的大小
f.setSize(500,400);
//调整窗体的位置
f.setLocation(300,200);
//设置窗体的布局管理器
f.setLayout(new FlowLayout());
//添加窗口监听器,参数是一个WindowAdapter的子类对象,此处采用匿
//名内部类的形式
//此匿名内部类中只复写了WindowAdapter的windowClosing方法
f.addWindowListener(newWindowAdapter()
{
public voidwindowClosing(WindowEvent e)
{
System.exit(0);
}
});
//设置窗体为可见
f.setVisible(true);
}
}
8、Action事件
(1)处理Action事件需要添加一个ActionListener监听器。添加ActionListener监听器可以用组件的addActionListener(ActionListenerl)方法。
(2)ActionListener:一个接口,用于接收操作事件的侦听器接口,对处理操作事件感兴趣的类可以实现此接口,而使用该类创建的对象可使用组件的addActionListener
方法向该组件注册。在发生操作事件时,调用该对象的actionPerformed
方法。
(3)actionPerformed(ActionEvent e)
方法:是ActionListener的一个方法。在发生操作时调用。
(4)示例:当点击按钮时退出窗口
importjava.awt.*;
importjava.awt.event.*;
public classFrameDemo
{
//定义组件引用
private Frame f;
private Button b;
//定义构造函数对窗体进行初始化
public FrameDemo()
{
init();
}
public void init()
{
//创建组件实例
f=new Frame("myframe");
b=newButton("button");
//设置窗体的大小
f.setSize(500,400);
//调整窗体的位置
f.setLocation(300,200);
//设置窗体的布局管理器
f.setLayout(newFlowLayout());
//将按钮添加到窗体中
f.add(b);
//设置窗体为可见
f.setVisible(true);
//对button组件添加Action事件监听器
b.addActionListener(newActionListener()
{
public voidactionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
//创建窗体
new FrameDemo();
}
}
9、鼠标事件
(1)处理鼠标事件需添加MouseListener监听器,可以通过Component组件的addMouseListener(MouseListenerl)方法添加。
(2)MouseListener:是一个接口,用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口。旨在处理鼠标事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类MouseAdapter
(仅重写所需的方法)。
(3)MouseAdapter
:
接收鼠标事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。扩展此类可创建MouseEvent
(包括拖动和移动事件)或/和MouseWheelEvent
侦听器,并针对所需事件重写方法。
(4)示例:当鼠标光标进入到button按钮时打印信息
importjava.awt.*;
importjava.awt.event.*;
public classFrameDemo2
{
private Frame f;
private Button b;
public FrameDemo2()
{
init();
}
public void init()
{
//创建组件并设置属性
f=new Frame("myframe");
b=newButton("button");
f.setSize(500,400);
f.setLocation(300,200);
f.setLayout(newFlowLayout());
f.add(b);
f.setVisible(true);
myEvent();
}
public void myEvent()
{
//对窗体添加窗体事件监听器
f.addWindowListener(newWindowAdapter()
{
public voidwindowClosing(WindowEvent e)
{
System.exit(0);
}
});
//对button组件添加鼠标事件监听器
b.addMouseListener(new MouseAdapter()
{
private int count=1;
public voidmouseEntered(MouseEvent e)
{
System.out.println("Mouseenter"+count++);
}
});
}
public static void main(String[] args)
{
//创建窗体
new FrameDemo2();
}
}
10、键盘事件
(1)处理键盘事件需添加按键监听器,可以通过Component组件的addKeyListener(KeyListener l)为某个组件方法添加一个按键监听器。
(2)KeyListener:是一个接口,用于接收键盘事件(击键)的侦听器接口。旨在处理键盘事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象KeyAdapter
类(仅重写有用的方法)。使用组件的addKeyListener
方法将从该类所创建的侦听器对象向该组件注册。
(3)KeyAdapter
:是一个抽象类,是
接收键盘事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。扩展此类即可创建KeyEvent
侦听器并重写所需事件的方法。
(4)示例:为button组件添加一个键盘监听器,当按下键盘时打印出按下的键盘所对应的字符:
import java.awt.*;
import java.awt.event.*;
public class FrameDemo3
{
privateFrame f;
privateButton b;
publicFrameDemo3()
{
init();
}
publicvoid init()
{
//创建组件并设置属性
f=newFrame("my frame");
b=newButton("button");
f.setSize(500,400);
f.setLocation(300,200);
f.setLayout(newFlowLayout());
f.add(b);
f.setVisible(true);
myEvent();
}
publicvoid myEvent()
{
//对窗体添加窗体事件监听器
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//对按钮添加键盘监听器
b.addKeyListener(newKeyAdapter()
{
publicvoid keyPressed(KeyEvent e)
{
System.out.println(e.getKeyChar());
}
});
}
publicstatic void main(String[] args)
{
//创建窗体
newFrameDemo3();
}
}
11、练习:列出指定目录内容
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class FrameDemoTest
{
//声明组件
privateFrame f;
privateTextField tf;
privateButton b;
privateTextArea ta;
publicFrameDemoTest()
{
init();
}
public void init()
{
//初始化组件
f=new Frame("my frame");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf=new TextField(60);
b=new Button("turn");
ta=new TextArea(25,70);
//将组件添加到窗体组件
f.add(tf);
f.add(b);
f.add(ta);
myEvent();
f.setVisible(true);
}
privatevoid myEvent()
{
//以button组件添加Action事件监听器
b.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
//获取文本框组件的文本内容
StringdirPath=tf.getText();
//根据文本框内容创建文件对象
Filedir=new File(dirPath);
//若文件内容是目录则将目录下的文件名打印在文件区域中
if(dir.exists()&& dir.isDirectory())
{
ta.setText("");
String[]names=dir.list();
for(Stringname:names)
{
ta.append(name+"\r\n");
}
}
}
});
//添加窗体事件监听器
f.addWindowListener(newWindowAdapter()
{
public void windowClosing(WindowEvente)
{
System.exit(0);
}
});
}
publicstatic void main(String[] args)
{
//创建窗体
newFrameDemoTest();
}
}
程序运行结果:
12、Dialog
(1)Dialog 是一个带标题和边界的顶层窗口。Dialog 的默认布局为BorderLayout
。
(2)示例:点击窗体的按钮时弹出Dialog窗口
import java.awt.*;
import java.awt.event.*;
public class FrameDemo4
{
//声明组件
private Framef;
private Dialogd;
private Buttonbut;
private ButtonOKbut;
private Labell;
publicFrameDemo4()
{
init();
}
public voidinit()
{
//初始化窗体组件
f=newFrame("my frame");
f.setBounds(300,100,600,500);
f.setLayout(newFlowLayout());
//初始化Dialog组件
d=newDialog(f,"info",true);
d.setBounds(400,200,240,150);
d.setLayout(newFlowLayout());
//初始化Label组件
l=newLabel();
but=newButton("button");
f.add(but);
OKbut=newButton("OK");
//将Label和Button组件添加到Dialog组件
d.add(l);
d.add(OKbut);
myEvent();
f.setVisible(true);
}
private voidmyEvent()
{
//添加Dialog组件窗口事件监听器
d.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
//添加but组件Action事件监听器
but.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
l.setText("thisis a Dialog");
d.setVisible(true);
}
});
//添加OKbut组件Action监听器
OKbut.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
//添加Frame组件窗体事件监听器
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public staticvoid main(String[] args)
{
newFrameDemo4();
}
}
程序运行结果:
13、菜单
(1)MenuBar:MenuBar
类封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与Frame
对象关联,可以调用该框架的setMenuBar
方法。
(2)Menu
:Menu
对象是从菜单栏部署的下拉式菜单组件。
(3)MenuItem
:
菜单中的所有项必须属于类MenuItem
或其子类之一。
(4)示例:
importjava.awt.*;
importjava.awt.event.*;
public classMenuDemo
{
private Frame f;
//添加菜单栏组件
private MenuBar mb;
//添加菜单组件
private Menu m,subMenu;
//添加菜单条组件
private MenuItem closeItem,subItem;
public MenuDemo()
{
init();
}
public void init()
{
//初始化组件
f=new Frame("myframe");
f.setBounds(300,100,500,600);
f.setLayout(new FlowLayout());
mb=new MenuBar();
m=new Menu("file");
subMenu=newMenu("submenu");
subItem=newMenuItem("subItem");
closeItem=newMenuItem("exit");
subMenu.add(subItem);
//将菜单条添加到菜单中
m.add(subMenu);
m.add(closeItem);
//将菜单添加到菜单栏中
mb.add(m);
//将菜单栏与Frame组件关联
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
private void myEvent()
{
f.addWindowListener(newWindowAdapter()
{
public voidwindowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
new MenuDemo();
}
}