一、创建图形用户界面
图形用户界面(GUI):
是程序与用户交互的方式,利用它系统可以接受用户的输入并向用户输出程序运行的结果。
1.相关联的包
与图形用户界面相关的接口和类都组织放在两个包里:
1. java.awt包: 提供了大量进行GUI设计所使用的的类和接口,是进行GUI程序设计的基础。
>2. Javax.swing包: 由100%纯Java实现的,没有本地代码,不依赖操作系统的支持,因而也称为轻量级组件。
2.步骤
(1)创建容器: 放置各种组件的地方。
(2) 布局管理: 如何摆放各个组件。
(3) 添加组件
(4) 事件处理: 程序能够响应用户的操作。
二、JFrame类
通常使用Container的子类JFrame来构建容纳组件的容器,继承关系如下:
注:
1. 容器Container
是一个类,它允许组件被放置在其中。
2. 容器本身也是组件,但主要功能是放置组件和其它的子容器
。
1.构造方法
构造方法名 | 方法功能 |
---|---|
JFrame() | 构造JFrame的一个实例(初始时不可见) |
JFrame(String title) | 构造一个初始不可见的、具有指定标题 的JFrame对象 |
2.方法
方法名 | 方法功能 |
---|---|
boolean isResizable() | 判断frame是否可调整大小 |
remove( MenuComponent m) | 从frame移除指定的菜单栏 |
setIconImage( Image image) | 设置frame最小化时显示的图标 |
setJMenuBar(MenuBar mb) | 将frame的菜单栏设置为指定的菜单栏 |
setResizable(boolean resizable) | 设置frame是否可由用户调整大小 |
setTitle(String title) | 将 frame 的标题设置为指定的字符串 |
setSize( int width,int height) | 设置frame大小 |
setLocation(int x,int y) | 设置frame位置,其中(x,y)为左上角坐标 |
setDefaultCloseOperation(intoperation) | DO_ NOTHING_ ON_ CLOSE , HIDE_ON_CLOSE, DISPOSE_ON_ CLOSE,EXIT_ON_CLOSE |
三、JPanel类
JPanel的继承方式如下:
1.构造方法
构造方法名 | 方法功能 |
---|---|
JPanel(LayoutManager layout) | 创建具有指定布局管理器的JPanel容器 |
JPanel() |
使用默认的布局管理器FlowLayout创建JPanel容器 |
四、常见布局方式
容器嵌套:
为了使布局更加易于管理,一个包含了多个组件的容器本身可以作为一个组件组件添加到另一个组件中去,就相当于容器中再添加容器,这样就形成了容器的嵌套
。
1.流式布局 — FlowLayout
FLowLayout
是JPanel类
缺省的布局管理器。其组建的放置规律是从上到下,从左到右进行放置。
(1)构造方法
构造方法名 | 方法功能 |
---|---|
FlowLayout( int align, int hgap, int vgap);如:new FlowLayout(FlowLayout.LEFT,20,40); | 第一个参数是组件的对齐方式;第二个参数是组件之间横向间隔;第三个参数是组件之间的纵向间隔,单位是象素。 |
FlowLayout(int align);如:New FlowLayout(FlowLayout.LEFT); | 它具有指定的对齐方式,默认的水平和垂直间隙是5个单位。 |
FlowLayout(); | 缺省的对齐方式居中对齐,横向间隔和纵向间隔都是缺省值5个象素 |
(2)案例
public class FlowLayoutDemo extends JFrame{
public FlowLayoutDemo() {
super("FlowLayout布局");//利用super方法来指定窗口的标题
FlowLayout flow = new FlowLayout(FlowLayout.LEFT,8,2);//构建一个流式布局,参数1是指默认的是居左对齐,参数2、3是指FlowLayout容器里面放置的组件的水平间距和垂直间距,分别是8个像素和2个像素
setLayout(flow);//JFrame默认的是borderLayout布局方式,所以此语句为设置JFrame的布局为流式布局
for(int i=1;i<=10;i++) {
//创建10个按钮组件并添加到容器
JButton b = new JButton("i am"+i);
add(b);//调用add()方法创建完之后添加到容器上面去
}
setBounds(200,200,600,300);//设置容器在屏幕中显示的位置、宽度和高度,前两个参数为显示的起点坐标为(200,200),后两个参数为宽度和高度为300和600像素
setVisible(true);//设置为可见性,若为false时界面显示不出
}
public static void main(String[] args) {
new FlowLayoutDemo();
}
}
效果图:
2.边界布局 — BorderLayout
BorderLayout
是JFrame
缺省的布局管理器,如图所示,它把容器分成5个区域:North、South、East、West和Center,每个区域只能放置一个组件。
(1)构造方法
构造方法名 | 方法功能 |
---|---|
BorderLayout(int hgap, intvgap); | 构造一个具有指定组件间距的边界布局 |
BorderLayout(); | 构造一个组件之间没有间距的边界布局 |
(2)案例
public class BorderLayoutDemo extends JFrame{
public BorderLayoutDemo() {
super("BorderLayout布局");//传递当前界面的标题
setLayout(new BorderLayout());//指定布局方式borderLayout布局
setBounds(100,100,600,600);//设置起点坐标,宽度以及高度
//创建了四个按钮分别对应的是我在南边、我在北边、我在西边、我在东边
JButton bSouth = new JButton("我在南边"),
bNorth = new JButton("我在北边"),
bEast = new JButton("我在西边"),
bWest = new JButton("我在东边");
//中间区域是构建了一个JTextArea这样一个对象,表示放在整个容器的中央位置
JTextArea bCenter = new JTextArea("我在中心");
add(bNorth,BorderLayout.NORTH); //利用add()方法把这些组件添加到对应的要放到北部区域
add(bWest,BorderLayout.SOUTH);//一定要注意:添加组件时一定要指明它要添加的方向!(如果没有写添加方向的话它会默认的把这个组件添加到中央center区域)
add(bSouth,BorderLayout.EAST);
add(bEast,BorderLayout.WEST);
add(bCenter,BorderLayout.CENTER);
setVisible(true);//设置可见性
}
public static void main(String[] args) {
new BorderLayoutDemo();
}
}
效果图:
3.卡片布局 — CardLayout
CardLayout
布局将容器中的每个组件看做一张卡片,一次只能看到一张卡片。
(1)构造方法
构造方法名 | 方法功能 |
---|---|
CardLayout() | 创建一个间距大小为0 |
CardLayout (int hgap, int vgap) | 创建个指定水平间距和垂直间距的卡片布局 |
(2)方法
方法名 | 方法功能 |
---|---|
void first(Container parent) | 移到指定容器的第一张卡片 |
void next(Container parent) | 移到指定容器的下一张卡片 |
void previous(Container parent) | 移到指定容器的前一张卡片 |
void last(Container parent) | 移到指定容器的最后一张卡片 |
void show(Container parent,String name) | 显示指定卡片 |
(3)案例
public class CardLayoutDemo extends JFrame{
private JButton buttonFirst,buttonLast,buttonNext;
CardLayoutDemo(){
super("CardLayout布局演示");//定义这个界面的名字
CardLayout mycard = new CardLayout();//构造CardLayout的一个对象
JPanel pCenter = new JPanel();//构建一个JPanel作为CardLayout的一个子容器
pCenter.setLayout(mycard);//利用setLayout()方法来选择不同的布局管理器来决定布局,此处选了作为CardLayout布局管理器
for(int i=1;i<=20;i++) {
//利用for循环的方式创建了20个按钮,这20个按钮是共用同一块儿区域的
pCenter.add("i am"+i,new JButton("我是第"+i+"个按钮"));
}
//显示指定的卡片,默认显示的是第1个
mycard.show(pCenter, "i am3");//显示在pCenter这个容器上,他显示的是指定字符串“i am3”这样一个按钮,默认如果没有指定显示按钮的话它是显示第一个,也就是不写这条语句它默认的是显示第一个按钮
JPanel pSouth = new JPanel();//又构建了一个JPanel类型的对象,也是作为子容器存在的
buttonFirst = new JButton("first");//构建了三个按钮,把这三个按钮都添加到pSouth这个子容器上面
buttonLast = new JButton("last");
buttonNext = new JButton("next");
pSouth.add(buttonFirst);//JPanel如果没有指定他的布局方式,它默认的布局方式是flowLayout,那三个按钮就会依次按照顺序摆放到这个JPanel容器上
pSouth.add(buttonNext);
pSouth.add(buttonLast);
add(pCenter,BorderLayout.CENTER);//调用add方法把pCenter这样一个子容器添加到最外层borderLayout的中央区域
add(pSouth,BorderLayout.SOUTH);//pSouth这样一个子容器添加到borderLayout的最南边区域
setBounds(10,10,600,590);//设置容器的边界
setVisible(true);//设置容器的可见性
}
public static void main(String[] args) {
new CardLayoutDemo();
}
}
效果图:
4.网格布局 — GridLayout
GridLayout
布局以矩形网格形式对容器的组件进行布置,容器被分成大小相等的矩形,一个矩形中放置一个组件。
(1)构造方法
构造方法名 | 方法功能 |
---|---|
GridLayout() | 以默认的单行、 每列布局一个组件的方式构造网格布局 |
GridLayout(int rows,int cols) | 以指定的行和列构造网格布局 |
GridLayout(int rows,int cols,int hgap,int vgap) | 以指定的行、列、水平间距和垂直间距构造网格布局 |
(2)案例
public class GridLayoutDemo extends JFrame{
public GridLayoutDemo() {
super("网络布局演示");//定义界面的标题
GridLayout grid = new GridLayout(12,12);//定义12排12列
setLayout(grid);// 写成 “ this.setLayout(grid); ” 也可以
//使用二维数组创建12*12个标签组件
JLabel label[][] = new JLabel[12][12];//创建JLabel对象
for(int i=0;i<12;i++) {
//通过二维循环的方式初始化这个JLabeld对象
for(int j=0;j<12;j++) {
label[i][j] = new JLabel();
//JLable默认情况下是透明的,所以如果不设置成不透明的,那么后面设置背景色的方法就不起作用了
label[i][j].setOpaque(true);//如果写成是 “ label[i][j].setOpaque(false); ” 的话黑白格子就显示不出来了,因为默认背景颜色是透明的
if((i + j) % 2 == 0) {
label[i][j].setBackground(Color.black);
}else {
label[i][j].setBackground(Color.white);
}
add(label[i][j]);
}
}
setBounds(10,10,600,600);//设置容器的边界
setVisible(true);//设置容器的可见性
}
public static void main(String[] args) {
new GridLayoutDemo();
}
}
效果图:
5.布局五 — GridBagLayout
(1)构造方法
构造方法名 | 方法功能 |
---|---|
GridBagLayout() | 建立一个新的 GridBagLayout管理器 |
GridBagConstraints() | 建立一个新的 GridBagConstraints()对象 |
GridBagConstraints(int gridx, int gridy,) | 建立一个新的 GridBagConstraints()对象,并指定其参数的值 |
6.布局六 — BoxLayout
(1)构造方法
构造方法名 | 方法功能 |
---|---|
BoxLayout(Container target,int axis) | 创建一个将沿给定轴放置组件的布局管理器 |
注: 其中axis有BoxLayout.X_AXIS()横向和BoxLayout.Y_AXIS(纵向)两个方向
(2)方法
方法名 | 方法功能 |
---|---|
getAxis() | 返回用于布局组件的轴 |
getLayoutAlignmentX (Container target) | 返回容器沿X轴的对齐方式 |
getLayoutAlignmentY (Container target) | 返回容器沿Y轴的对齐方式 |
getTarger() | 返回使用此布局管理器的容器 |
五、事件处理
1.四要素
(1)
事件源:
究竟是谁引发了事件的发生,在面向对象编程语言中,事件源指的是引发事件发生的各个组件。
(2)事件:
引发了什么类型的事件发生,在Java中不同类型的事件会对应相应的事件类。
(3)事件处理者:
究竟谁有能力对事件进行处理。
(4)注册:
建立事件源和事件处理者的关联。
2.事件类型
注: 不同事件类型Java中是使用不同的类来描述的,大多数事件类包含在Java.awt.event包
里,所有事件类的父类都是AWTEvent类
。
事件类型 | 触发事件的动作 |
---|---|
ActionEvent | 当用户单击按钮、选择菜单项或选择一个列表项时产生ActionEvent事件 |
ItemEvent | 当用户在组合框选择一项时 产生ItemEvent事件 |
TextEvent | 当文本域或文本框中的内容发生变化时产生,TextEvent事件 |
FocusEvent | 组件得到焦点或失去焦点时发生 |
WindowEvent | 窗口被激活、图标化、还原或关闭时发生 |
KeyEvent | 按下或释放一个键时发生 |
MouseEvent | 按下、释放鼠标按钮,移动或拖动鼠标的发生 |
3.监听接口
注: 不同类型的事件,事件处理的类要实现不同的监听接口。
接口 | 需要实现的方法 | 说明 |
---|---|---|
ActionListener | actionPerformed(ActionEvent e) | 最广泛使用的事件处理接口 |
ItemListener | itemStateChanged(ItemEvent e) | 在用户已选定或取消选定某)项时调用,用于列表及具有选项变化的组件 |
TextListener | textValueChanged(TextEvent e) | 文本的值已改变时调用 |
FocusListener | focusGained(Focus Event e) focusLost(Focus Event e) | 组件获得键盘焦点时调用 组件失去键盘焦点时调用 |
KeyListener | keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e) | 按下某个键时 ; 释放某个键时;键入某个键时 |
MouseListener | mouseClicked(MouseEvent e); mouseEntered(MouseEvent e); mouseExited(MouseEvent e); mousePressed(MouseEvent e); mouseReleased(MouseEvent e) | 鼠标按键在组件上单击(按下并释放); 鼠标进入到组件; 鼠标离开组件; 鼠标按键在组件上按下; 鼠标按键在组件上释放 |
MouseMotion Listener | mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) | 鼠标按键在组件上按下并拖动 ;鼠标光标移动到组件上 |
4.适配器
注:
在进行事件处理时,如果通过实现接口就必须要实现该接口所要求的所有方法,即使有些方法我们不需要实现,也必须实现,因此,Java设计者设计了一种特殊的API类
,称之为适配器Adapter,适配器实现了对应的接口,这样一来如果通过继承适配器
的方式就可以根据需要重写我们所关心的方法,大大的简化事件处理编程。
接口 | 适配器 |
---|---|
ActionListener | 无 |
ItemListencr | 无 |
AdjustmentListener | 无 |
ComponentListener | ComponentAdapter |
MouseListener | MouseAdapter |
MouseMotionListener | MouseMotionAdapter |
WindowListener | WindowAdapter |
KeyListener | KeyAdapter |