GUI的概念
● 到目前为止,我们编写的都是基于控制台的程序;
● GUI(Graphical User Interface)即图形用户界面,它能够使应用程
序看上去更加友好;
Swing概述
● Swing是纯Java组件,使得应用程序在不同的平台上运行时具有相同外观和相同
的行为。
● Swing中的大部分组件类位于javax.swing包中.
● Swing中的组件非常丰富,支持很多功能强大的组件.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jbFd0bxZ-1630720691972)(C:\Users\何文强\AppData\Roaming\Typora\typora-user-images\1627090689386.png)]
容器组件
Java的图形用户界面的基本组成部分是组件,组件是一个以图形化的方式
显示在屏幕上并能与用户进行交互的对象;
组件不能独立地显示出来,必须将组件放在一定的容器(container)中才
可以显示出来。
容器可以容纳多个组件,通过调用容器的add(Component comp)方法
向容器中添加组件。
窗口(Frame)和面板(Panel)是最常用的两个容器。
JFrame() -------创建新窗体,该窗体初始为不可见
JFrame(String title)------创建新窗体,使用参数title指定标题,该窗体初始为不可见
this.setSize(500, 500);//窗口大小
//this.setLocation(200, 200);
this.setLocationRelativeTo(null);//设置窗口居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮选项
this.setTitle(“这是GUI窗口”);//标题
this.setResizable(false);//不能设置大小
this.setIconImage(new ImageIcon(“wy.png”).getImage());//加入背景图
this.setVisible(true);//显示窗口
常用容器 Jpanel
● JPanel提供面板,它是轻量级的容器;
● 面板中可以添加其它组件,也可以设置布局,我们一般使用面板来实现布局嵌套;
● 框架(JFrame) 内部包含一个名叫Container(内容面板)的面板容器,如果要给 框架中添加图形控件,通常将它们加入到这个内容面板中。
● 通过JFrame类中的getContentPane()方法即可获得此框架的内容面板。
● 也可以自己创建Jpanel面板对象,把JPanel作为一个组件添加到某个容器中.
常用方法:
void setBackground(Color bg)设置面板的背景色,由参数bg指定颜色
void setLayout(LayoutManager mgr)设置面板的布局,参数是布局管理器
Component add(Component comp)往面板中添加一个组件
void remove(Component comp)从面板中移除指定的组件
void removeAll()从面板中移除所有组件
布局管理器
● swing中,提供了布局管理器类的对象可以管理
● 每个Jpanel都有一个布局管理器对象,当容器需要对某个组件进行定位或判 断其大小尺寸时,就会调用其对应的布局管理器,调用Jpanel的setLayout方 法改变其布局管理器对象或通过构造方法设置。
● Java中的图形界面在布局管理上采用容器和布局管理相分离的方案,也
就是说容器只是把组件放进来,但它不管怎样放置。至于如何放置需要
用到布局管理器(Container) 。Java中有几种常用的布局管理器,分
别是:FlowLayout , BorderLayout, GridLayout。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zHceeBFr-1630720691980)(C:\Users\何文强\AppData\Roaming\Typora\typora-user-images\1627100710283.png)]
FlowLayout
FlowLayout布局管理器是流式布局管理器,它将组件按照从左到右、从上到下的顺序来安排,
并在默认情况下使组件尽量居中放置。
this.setLayout(new FlowLayout());
this.add(new Button(“确定”));
this.add(new Button(“取消”));
FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。
不改变组件的大小,按组件原有尺寸显示组件,可设置不 同的组件间距,行距以及对齐方式。
构造方法
new FlowLayout(FlowLayout.RIGHT,20,40);右对齐,组件之间水平间距20个像素,垂直间距40
个像素。
new FlowLayout(FlowLayout.LEFT);左对齐,水平和垂直间距为缺省值(5)。
new FlowLayout();使用缺省的居中对齐方式,水平和垂直间距为缺省值(5)。
//面板的布局方式默认是流式布局
new FlowLayout(FlowLayout.LEFT,10,20)
BorderLayout
BorderLayout布局管理器只允许在容器内放置5个组件,这5个组件的位置是由BorderLayout类中的
North、South、East、West和Center5个常量来确定的,他们对应着容器中的上下左右中,用法如下:
this.add(new Button(“按钮”) ,BorderLayout.NORTH);
this.add(new Button(“按钮”) ,BorderLayout.CENTER);
组件在BorderLayout中的大小都是可以改变的。一般情况下可以让中间区域大一些,而且可以只用其中几
个区域。
● BorderLayout将整个容器的布局划分成东(EAST)西(WEST)南(SOUTH)北(NORTH)中
(CENTER)五个区域,组件只能被添加到指定的区域。
● 如不指定组件的加入部位,则默认加入到CENTER区。
● 每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。
● BorderLayout型布局容器尺寸缩放原则:
● 北、南两个区域在水平方向缩放。
● 东、西两个区域在垂直方向缩放。
● 中部可在两个方向上缩放。
//边界布局 总共有5个区域 上,下,左,右,中间(必须),添加进来的组件,默认最大化
JPanel jp = new JPanel(new BorderLayout());
GridLayout
● GridLayout布局管理器是矩形网格,在网格中放置组件,每个网格的高度和宽
度都相等,组件随着网格的大小而在水平和垂直方向上拉伸,网格的大小是由容器的
大小和创建网格的多少来确定的。其用法如下:
this.setLayout(new GridLayout(2 , 3)); //创建一个2行3列的网格
this.add(new Button(“按钮”));
当组件数目大于网格数时,GridLayout保持行数不变而自动增加列数。
● GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。
组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。
● 在 GridLayout 构造方法中指定分割的行数和列数.
//网格布局(表格) 设置行数,列数,从第一行第一列开始添加组件,一行占满时,从第二行开始
//组件数量超出后,会扩展一列
JPanel jp = new JPanel(new GridLayout(2, 2));
常用组件
标签(JLabel)
标签是容纳文本和图标的控件,通常用来在界面中标识别的控件。
构造函数:
JLabel()
创建一个空的标签
JLabel(String text) 创建一个带文本的标签
JLabel(Icon image)
创建一个带图像的标签
方法:
void setText(String text)
设置标签上的文本
String getText()
获得标签上的文本
void setVisible(boolean b) 设置标签是否为可见
setFont(new Font(“宋体”,Font.BOLD, 18)); 设置字体
单行文本(JTextField)
JTextField的构造函数:
JTextField()
JTextField(String text )
JTextField(int columns)
JTextField(String text, int columns)
方法:
void setText(String text)
设置文本框中的文本
String getText()
获得文本框中的文本
void setEditable(boolean b)
设置文本框是否可以编辑
void setVisible(boolean b)
设置文本框是否为可见
setColumns(20); 设置列数
多行文本框(JTextArea)
构造函数:
JTextArea()
创建一个空的文本域
JTextArea(String text)
用指定文本初始化文本域
JTextArea(int rows, int columns) 创建一个指定行数和列数的空文本域
JTextArea(String text,int rows, int columns)
创建一个带文本,并指行数和列数的
方法:
void setText(String text) 设置文本域中的文本
String getText() 获得文本域中的文本
void setFont(Font font) 设置文本域中文本的字体
void setLineWrap(boolean wrap) //是否自动换行,默认false
void setWrapStyleWord(boolean word) //是否以单词边界换行,默认false。
如果需要文本区自动出现滚动条,可将文本区对象放入滚动窗格(JScrollPane)中:
JScrollPane scrollPane = new JScrollPane(txtArea);
add(scrollPane );
密码框(JPasswordField)
构造函数:
JPasswordField()
JPasswordField(String text)
JPasswordField(String text, int columns)
方法:
char[] getPassword()
按钮(JButton)
构造方法:
JLabel(String text)
创建一个带文本的标签
JLabel(Icon image)
创建一个带图像的标签
方法:
void setText(String text)
设置按钮上的文本
String getText()
获得按钮上的文本
void setBackground(Color bg)
设置按钮的背景色
Color getBackground()
获得按钮的背景色
void setEnabled(boolean b)
设置启用(或禁用)按钮,由参数b决定
void setVisible(boolean b)
设置按钮是否为可见,由参数b决定
void setToolTipText(String text)
设置按钮的悬停提示信息
菜单栏组件:
构造方法:JMenuBar();
方法:add(menu); 向菜单栏添加菜单
菜单组件:
构造方法:JMenu(“菜单名称");
方法:add(menuItem); 向菜单添加菜单选项
菜单项组件:
构造方法:JMenuItem(“菜单项名称");
将菜单栏添加到窗口
setJMenuBar(menuBar);
事件处理
● 对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前
为止,我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任
何实际的功能,要实现相应的功能,必须进行事件处理;
● 用户与GUI组件进行交互就会发生事件,如:按下一个按钮、用键盘输
入一个字符、点击鼠标等等;
● 当前我们要关注的并不是“事件是如何产生的”,而是讨论当发生事件
后,我们应当“如何处理之”。
● Java中,事件处理的基本思路如下:
● 一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,
监听器只是简单地等待,直到它收到一个事件,一旦事件被接受,监听
器将处理这些事件;
● 一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通
知。
• 由于我们想要处理按钮的点击事件,因此,按钮便是事件源;
• 监听器类型是ActionListener。
● 添加事件监听器(此处即为匿名类)
按钮对象.addActionListener(new ActionListener() {
// 事件处理
@Override
public void actionPerformed(ActionEvent e) {
执行操作
}
});
对话框
JOptionPane对话框
showMessageDialog():消息对话框
主要有五种消息类型,类型不同,图标不同:
ERROR_MESSAGE 错误消息提示
INFORMATION_MESSAGE 信息提示
WARNING_MESSAGE 警告提示
QUESTION_MESSAGE 问题提示
PLAIN_MESSAGE 简洁提示
showConfirmDialog():确认对话框
主要有四种消息类型,类型不同,图标不同:
DEFAULT_OPTION 默认选项
YES_NO_OPTION 是/否选项
YES_NO_CANCEL_OPTION 是/否/取消选项
OK_CANCEL_OPTION 确定/取消
内部类
● 把类定义在另一个类的内部,该类就被称为内部类。
● 如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类
(或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。
● 内部类一般来说包括这四种:
成员内部类
静态内部类
局部内部类
匿名内部类
成员内部类
1.成员内部类
成员内部类——就是位于外部类成员位置的类
特点:可以使用外部类中所有的成员变量和成员方法(包括private的)
class Outer {
private int age = 20;
class Inner {
public void show() {
System.out.println(age);
}
}
}
class Test {
public static void main(String[] ages) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
● private修饰内部类
● 如果我们的内部类不想轻易被任何人访问,可以选择使用private修饰内部类,这
样我们就无法通过创建对象的方法来访问,想要访问只需要在外部类中定义一个
public修饰的方法,间接调用。这样做的好处就是,我们可以在这个public方法
中增加一些判断语句,起到数据安全的作用。
class Outer {
private class Inner {
public void show() {
System.out.println(“密码备份文件”);
}
}
//使用getXxx()获取成员内部类,可以增加校验语句(文中省略)
public Inner getInner() {
return new Inner();
}
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.getInner();
inner.show();
}
静态内部类
这种被 static 所修饰的内部类,按位置分,属于成员内部类,但也可以称作静态内
部类,也常叫做嵌套内部类.不能使用外部类的非static成员变量和成员方法
public class Outter {
int age = 10;
static int age2 = 20;
public Outter() {
}
static class Inner {
public void method() {
System.out.println(age);//错误
System.out.println(age2);//正确
}
}
}
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner();
inner.method();
}
}
局部内部类
局部内部类——就是定义在一个方法或者一个作用域里面的类
特点:主要是作用域发生了变化,只能在自身所在方法和属性中被使用
c l a s s O u t e r {
p ri v a t e i n t a g e = 2 0 ;
p u b l i c v o i d m e t h o d () {
f i n a l i n t a g e 2 = 3 0 ;
c l a s s I n n e r {
p u b l i c v o i d s h o w () {
Sy s t e m . o u t . p ri n t l n ( a g e );
/ /从内部类中访问方法内变量a g e 2,需要将变量声明为最终类型。
Sy s t e m . o u t . p ri n t l n ( a g e 2 );
}
}
I n n e r i = n e w I n n e r();
匿名内部类
一个没有名字的类,是内部类的简化写法
interface Inner {
public abstract void show();
}
c lass Outer {
publ ic void method(){
new Inner() {
publ ic void show() {
Sy s tem.out.println(“Hel loWorld”);
}
}. show();
}
}
class Test {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
内部类的特点
● 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立
的.class文件,但是前面冠以外部类的类名和$符号。
● 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部
类可以自由地访问外部类的成员变量,无论是否为 private 的。
● 内部类声明成静态的,就不能随便访问外部类的成员变量,仍然是只能
访问外部类的静态成员变量。
内部类的意义
1.封装性
2.实现多继承
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-teaWPW3Z-1630720691987)(C:\Users\何文强\AppData\Roaming\Typora\typora-user-images\1627106978882.png)]