本章任务
1.创建窗口,指定大小,位置,在窗口上可以自由添加组件,
2.自己可以合理布局
3.处理常见的按钮点击事件
本章目标
1.熟练使用JFrame的相关组件
2.能够将数据库表中的数据按照自己的意愿,展示在窗口容器中
3.对常见的布局管理器了解
4.能够理解事件处理机制,熟练使用常见的事件监听器(ActionListener,MouseListener),事件适配器(MouseAdapter)
AWT的基础知识
GUI(Graphical user interface,即图形用户界面),应用程序提供给用户操作的图形用户界面,包括菜单、窗口、按钮、工具栏、和其他各种屏幕元素。
在JDK中提供了AWT和Swing两个包,用于GUI程序的设计和开发。AWT是早期版本,swing是对awt的改进,提供了更加丰富的组件和功能,掌握了awt基本上就掌握了swing
GUI结构图
Component & Container
java的图形用户界面的最基本组成部分是Component,Component类及其子类的对象用来描述以图形化的方式显示在屏幕上并能与用户进行交互的GUI元素,例如,一个按钮,一个标签等。
一般的Component对象不能独立地显示出来,必须将“放在”某一的Container对象中才可以显示出来。
Container是Component子类,Container子类对象可以“容纳”别的Component对象。
Container对象可使用方法add(...)向其中添加其他Component对象。
Container是Component的子类,因此Container对象也可以被当作Component对象添加到其他Container对象中。
有两种常用的Container:
Window:其对象表示自由停泊的顶级窗口
Panel:其对象可作为容纳其他Component对象,但不能独立存在,必须被添加到其他Container中(如Window或Applet)
示例1:创建JFrame窗口,设置大小为(400,500),位置(200,100),设置窗口关闭操作,窗口可见。
package com.njwb.components.use;
import javax.swing.JFrame;
/**
* 新建一个窗口,在屏幕的指定位置显示
* JFrame 是Frame的子类
* @author Administrator
*
*/
public class Test01 {
public static void main(String[] args) {
//创建一个窗口
JFrame jf = new JFrame("My first JFrame");
//设置大小
jf.setSize(400, 500);
//设置位置(坐标)
jf.setLocation(200, 100);
//设置关闭操作, 退出即关闭
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口可见
jf.setVisible(true);
}
}
示例2 窗口居中显示(获取本机工具包—>获取屏幕尺寸—>(屏幕宽,高)),窗口大小仍为(400,500),窗口位置((w1-400)/2,(h1-500)/2)
package com.njwb.components.use;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
/**
* 屏幕居中显示
* setLocation(x,y) x,y指的的是你设置的窗口的左上角的坐标
* @author Administrator
*
*/
public class Test02 {
public static void main(String[] args) {
//创建一个窗口
JFrame jf = new JFrame("My second JFrame");
//设置大小
jf.setSize(400, 500);
//获取本机的工具包
Toolkit tk = Toolkit.getDefaultToolkit();
//获取屏幕的尺寸
Dimension d = tk.getScreenSize();
//获取屏幕的宽
int width = d.width;
//获取屏幕的高
int height = d.height;
//设置位置(坐标)
//jf.setLocation(width/2-200, height/2-250);
jf.setLocation((width-400)/2, (height-500)/2);
//设置关闭操作, 退出即关闭
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口可见
jf.setVisible(true);
}
}
示例3: 添加组件(添加1个按钮位置(100,400,80,40)),布局管理器设置为空,其余设置保持不变,
package com.njwb.components.use;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* 添加按钮
* @author Administrator
*
*/
public class Test03 {
public static void main(String[] args) {
//创建一个窗口
JFrame jf = new JFrame("My second JFrame");
//设置布局管理器为null 默认是BorderLayout
jf.setLayout(null);
//创建一个按钮
//JButton but = new JButton("按钮");
JButton but = new JButton();
//setText()设置按钮的显示文本
but.setText("按钮");
//该位置是相对于父容器左上角而言
//but.setLocation(100, 400);
//but.setSize(80, 40);
but.setBounds(100, 400, 80, 40);
//将按钮添加到窗口中
jf.add(but);
//设置大小
jf.setSize(400, 500);
//获取本机的工具包
Toolkit tk = Toolkit.getDefaultToolkit();
//获取屏幕的尺寸
Dimension d = tk.getScreenSize();
//获取屏幕的宽
int width = d.width;
//获取屏幕的高
int height = d.height;
//设置位置(坐标)
jf.setLocation((width-400)/2, (height-500)/2);
//设置关闭操作, 退出即关闭
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口可见
jf.setVisible(true);
}
}
布局管理器
BorderLayout
这是一个布置容器的边框布局,它可以对容器组件进行安排,并调整其大小,使其符合下列五个区域:北、南、东、西、中。每个区域最多只能包含一个组件,并通过相应的常量进行标识:NORTH、SOUTH、EAST、WEST、CENTER。当使用边框布局将一个组件添加到容器中时,要使用这五个常量之一。
根据其首选大小和容器大小的约束 (constraints) 对组件进行布局。NORTH 和 SOUTH 组件可以在水平方向上拉伸;而 EAST 和 WEST 组件可以在垂直方向上拉伸;CENTER 组件可同时在水平和垂直方向上拉伸,从而填充所有剩余空间
package com.njwb.layoutmanager.use;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* 布局1 是JFrame的默认布局管理器 边框布局
* BorderLayout()
* BorderLayout(int hgap, int vgap)
* @author Administrator
*
*/
public class TestBorderLayout {
public static void main(String[] args) {
//创建一个窗口
JFrame jf = new JFrame("My second JFrame");
//按钮之间没有间隔
//jf.setLayout(new BorderLayout());
// 水平间距, 垂直间距
jf.setLayout(new BorderLayout(5,12));
//创建一个按钮
JButton but1 = new JButton("按钮1");
but1.setBounds(100, 400, 80, 40);
JButton but2 = new JButton("按钮2");
but2.setBounds(100, 400, 80, 40);
JButton but3 = new JButton("按钮3");
but3.setBounds(100, 400, 80, 40);
JButton but4 = new JButton("按钮4");
but4.setBounds(100, 400, 80, 40);
JButton but5 = new JButton("按钮5");
but5.setBounds(100, 400, 80, 40);
//将按钮添加到窗口中
//两种都可以, 指定区域的BorderLayout.North 可以放在第一个参数或者第2个参数都可以
//jf.add(BorderLayout.NORTH,but1);
jf.add(but1,BorderLayout.NORTH);
jf.add(BorderLayout.SOUTH,but2);
jf.add(BorderLayout.WEST,but3);
jf.add(BorderLayout.EAST,but4);
jf.add(BorderLayout.CENTER,but5);
//设置大小
jf.setSize(400, 500);
//获取本机的工具包
Toolkit tk = Toolkit.getDefaultToolkit();
//获取屏幕的尺寸
Dimension d = tk.getScreenSize();
//获取屏幕的宽
int width = d.width;
//获取屏幕的高
int height = d.height;
//设置位置(坐标)
jf.setLocation((width-400)/2, (height-500)/2);
//设置关闭操作, 退出即关闭
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口可见
jf.setVisible(true);
}
}
FlowLayout
流布局一般用来安排面板中的按钮。它使得按钮呈水平放置,直到同一条线上再也没有适合的按钮。线的对齐方式由 align 属性确定。可能的值为:
· LEFT
· RIGHT
· CENTER
· LEADING
· TRAILING
package com.njwb.layoutmanager.use;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* 布局2 是Panel面板的默认布局管理器 流式布局
* FlowLayout(int align)
* FlowLayout(int align, int hgap, int vgap)
* @author Administrator
*
*/
public class TestFlowLayout {
public static void main(String[] args) {
//创建一个窗口
JFrame jf = new JFrame("My second JFrame");
//按钮之间没有间隔 默认居中对齐,水平,垂直,都是5个单位
//jf.setLayout(new FlowLayout()); 左对齐 ,水平,垂直都是5个单位
//jf.setLayout(new FlowLayout(FlowLayout.LEFT));
//水平间距是10个单位,垂直间距是20个单位
//jf.setLayout(new FlowLayout(FlowLayout.RIGHT,10,20));
//创建一个按钮
JButton but1 = new JButton("按钮1");
but1.setBounds(100, 400, 80, 40);
JButton but2 = new JButton("按钮2");
but2.setBounds(100, 400, 80, 40);
JButton but3 = new JButton("按钮3");
but3.setBounds(100, 400, 80, 40);
JButton but4 = new JButton("按钮4");
but4.setBounds(100, 400, 80, 40);
JButton but5 = new JButton("按钮5");
but5.setBounds(100, 400, 80, 40);
//将按钮添加到窗口中
jf.add(but1);
jf.add(but2);
jf.add(but3);
jf.add(but4);
jf.add(but5);
//设置大小
jf.setSize(400, 500);
//获取本机的工具包
Toolkit tk = Toolkit.getDefaultToolkit();
//获取屏幕的尺寸
Dimension d = tk.getScreenSize();
//获取屏幕的宽
int width = d.width;
//获取屏幕的高
int height = d.height;
//设置位置(坐标)
jf.setLocation((width-400)/2, (height-500)/2);
//设置关闭操作, 退出即关闭
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口可见
jf.setVisible(true);
}
}
GridLayout
GridLayout 类是一个布局处理器,它以矩形网格形式对容器的组件进行布置。容器被分成大小相等的矩形,一个矩形中放置一个组件。
package com.njwb.layoutmanager.use;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* 布局3 几行几列 网格布局
* GridLayout(int rows, int cols)
* 行数,列数 水平间距 垂直间距
* GridLayout(int rows, int cols, int hgap, int vgap)
* @author Administrator
*
*/
public class TestGridLayout {
public static void main(String[] args) {
//创建一个窗口
JFrame jf = new JFrame("My second JFrame");
//2 行,3 列
//jf.setLayout(new GridLayout(2,4));
jf.setLayout(new GridLayout(2,4,5,20));
//创建一个按钮
JButton but1 = new JButton("按钮1");
but1.setBounds(100, 400, 80, 40);
JButton but2 = new JButton("按钮2");
but2.setBounds(100, 400, 80, 40);
JButton but3 = new JButton("按钮3");
but3.setBounds(100, 400, 80, 40);
JButton but4 = new JButton("按钮4");
but4.setBounds(100, 400, 80, 40);
JButton but5 = new JButton("按钮5");
but5.setBounds(100, 400, 80, 40);
JButton but6 = new JButton("按钮6");
but6.setBounds(100, 400, 80, 40);
JButton but7 = new JButton("按钮7");
but7.setBounds(100, 400, 80, 40);
//将按钮添加到窗口中
jf.add(but1);
jf.add(but2);
jf.add(but3);
jf.add(but4);
jf.add(but5);
jf.add(but6);
jf.add(but7);
//设置大小
jf.setSize(400, 500);
//获取本机的工具包
Toolkit tk = Toolkit.getDefaultToolkit();
//获取屏幕的尺寸
Dimension d = tk.getScreenSize();
//获取屏幕的宽
int width = d.width;
//获取屏幕的高
int height = d.height;
//设置位置(坐标)
jf.setLocation((width-400)/2, (height-500)/2);
//设置关闭操作, 退出即关闭
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口可见
jf.setVisible(true);
}
}
事件处理机制
通过GUI组件用户可以对应用程序进行各种操作,反之,应用程序可以通过各种组件来收集用户的操作信息,比如移动鼠标,按下键盘等,GUI只是提供给用户操作的图形界面,但GUI本身并不对用户的操作结果负责,比如单击按钮,程序并不知道在单击按钮时应该做出什么样的反应,如果想要单击按钮时程序响应某种功能,我们就必须编写相应的程序代码。
上一节的程序中在我们点击关闭按钮时并不能关闭窗口和结束程序,只能通过结束进程的方式结束。
Java设计了一种专门的方式称为事件处理机制,来处理程序和用户之间的交互。
在事件处理机制中需要了解3个重要的概念
1、 事件:用户对组件的操作称为事件
2、 事件源:发生事件的组件就是事件源
3、 事件处理器:某个java类中负责处理事件的成员方法。(我们要对事件进行处理肯定是编写程序代码,当发生了某种事件,只要调用写好的程序代码即可)
事件源、事件、事件处理器之间的工作关系:
对某个事件的处理的方法必须是java中的某个类的成员方法,这个类就称为事件监听器类,一个事件监听器对象必须先跟某个事件源进行关联,关联的过程称为监听器向事件源注册监听,这样当组件发生事件时,就知道该找哪个事件监听对象中的哪个方法了。
注册完后,当组件接收到外部的作用,组件就会产生事件对象,并将事件对象传递给事件处理器来处理,在事件处理器中,只要打开事件对象看事件对象中的信息就知道发生了什么样的事情和事情的一些细节,比如发生事件时鼠标的位置。
举例:按钮点击事件
package com.njwb.components.use;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* 点击按钮,在控制台输出一句话“按钮被点击”
* 事件的源头 : 按钮
* 事件处理器: 点击按钮,引发一个响应,这个响应需要1个类来处理掉,这个类 就叫做 事件处理器
* 事件源 和事件处理器之间如何建立联系? 给事件源注册监听 addActionListener(事件处理器对象);
* @author Administrator
*
*/
public class Test04 {
public static void main(String[] args) {
//创建一个窗口
JFrame jf = new JFrame("My second JFrame");
//设置布局管理器为null 默认是BorderLayout
jf.setLayout(null);
//创建一个按钮
JButton but = new JButton("按钮");
but.setBounds(100, 400, 80, 40);
//创建1个事件处理器对象
//给自身注册监听
but.addActionListener(new ActionListener(){
//动作发生时,会有一个事件传入,在该方法中将该事件处理掉(对该事件作出响应)
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击");
}
});
//将按钮添加到窗口中
jf.add(but);
//设置大小
jf.setSize(400, 500);
//获取本机的工具包
Toolkit tk = Toolkit.getDefaultToolkit();
//获取屏幕的尺寸
Dimension d = tk.getScreenSize